【问题标题】:Firestore cloud function - how to return second queryFirestore 云功能 - 如何返回第二个查询
【发布时间】:2021-03-07 21:08:35
【问题描述】:

我有一个 on-create 云功能,我想将数据从一个容器移动到另一个容器。第一个查询似乎运行正常(我正在检查数据),但我添加的第二个查询似乎失败了,我知道我必须从云函数返回一个承诺,但它仍然应该返回内部的?

exports.msgMove = functions.firestore.document('/msgTemp/{documentId}')
.onCreate( (snap:any, context:any) => {

  const data = snap.data();

  // Has this user already replied?
  return firestore.collection("msg")
  .where('threadId', '==', snap.data().threadId)
  .where('trackId', '==', snap.data().trackId)
  .where('uid', '==',  snap.data().uid)
  .orderBy("created", "desc")
  .limit(1)
  .get()
  .then(async (query) => {

      if(query.empty){

        const {threadId, trackId, uid} = snap.data();

        // Below seems to be failing
        const add = await firestore.collection("msg").add(
          {
            threadId,
            trackId,
            uid
          }
        );

        return add;

      }

      return;

  })
});

我得到了错误:

{"severity":"WARNING","message":"函数返回未定义,预期的 Promise 或值"}

【问题讨论】:

    标签: node.js firebase google-cloud-firestore google-cloud-functions


    【解决方案1】:

    不推荐您将then()async/await (.then(async (query) => {...})) 混合使用。

    你应该这样做:

    仅使用then()

    exports.msgMove = functions.firestore.document('/msgTemp/{documentId}')
        .onCreate((snap: any, context: any) => {
    
            const data = snap.data();
    
            // Has this user already replied?
            return firestore.collection("msg")
                .where('threadId', '==', data.threadId)
                .where('trackId', '==', data.trackId)
                .where('uid', '==', data.uid)
                .orderBy("created", "desc")
                .limit(1)
                .get()
                .then((querySnapshot) => {
                    if (querySnapshot.empty) {
                        const { threadId, trackId, uid } = snap.data();
    
                        return firestore.collection("msg").add(
                            {
                                threadId,
                                trackId,
                                uid
                            }
                        );
                    } else {
                        return null;
                    }
    
                });
        });
    

    我们使用 then()(它返回一个 Promise)由 Firebase 异步方法返回的 chain the promises

    仅使用async/await

    exports.msgMove = functions.firestore
        .document('/msgTemp/{documentId}')
        .onCreate(async (snap: any, context: any) => {   // <== See the async keyword
       
            const data = snap.data();
    
            // Has this user already replied?
            const querySnapshot = await firestore
                .collection('msg')
                .where('threadId', '==', data.threadId)
                .where('trackId', '==', data.trackId)
                .where('uid', '==', data.uid)
                .orderBy('created', 'desc')
                .limit(1)
                .get();
    
            if (querySnapshot.empty) {
                const { threadId, trackId, uid } = snap.data();
    
                await firestore.collection('msg').add({
                    threadId,
                    trackId,
                    uid,
                });
            }
            return null;
        });
    

    【讨论】:

    • 异步版本工作谢谢,但我必须从返回 null 更改为:return Promise.resolve("Finished...");因为你必须回报我认为的承诺
    • AFAIK 返回null(或其他值)没问题,异步函数总是返回 Promise。
    • 如果我的回答对您有帮助,您也可以点赞。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2021-04-05
    • 2023-03-27
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    • 2019-06-15
    相关资源
    最近更新 更多