【问题标题】:Firebase Cloud Functions: TypeError snapshot.forEach is not a functionFirebase 云函数:TypeError snapshot.forEach 不是函数
【发布时间】:2020-10-09 10:09:46
【问题描述】:

我一直在努力理解为什么我的 Firebase 云功能不起作用。

当新用户注册并创建该用户的文档时,我将删除名为“anglerNumbers”的集合中的保留号码。我在客户端上使用它来确保保留的号码不能被使用两次。我在这里关注文档:https://firebase.google.com/docs/firestore/query-data/queries?authuser=0(使用 Node.js)

但我不断收到错误:TypeError: snapshot.forEach is not a function

函数如下:

exports.newUser = functions.firestore.document('users/{userId}')
.onCreate((snap, context) => {
    const newUserNumber = snap.data().anglerNumber;
    const anglersRef = admin.firestore().collection('anglerNumbers');
    const snapshot = anglersRef.where('anglerNumber', '==', newUserNumber).get();
    if (snapshot.empty) {
        console.log('No matching documents.');
        return;
    }  
    snapshot.forEach(doc => {
        console.log(doc.id, '=>', doc.data());
        doc.delete();
    });
}) 

它不会控制台日志“没有匹配的文档”。所以有文档,但我无法按照文档的指示执行 forEach。我错过了什么?谢谢!

【问题讨论】:

  • get() 返回一个承诺。你应该先等待它的解决。

标签: firebase google-cloud-functions


【解决方案1】:

在您的代码中的这一行:

const snapshot = anglersRef.where('anglerNumber', '==', newUserNumber).get();

您假设 get 立即解析为快照,但实际上 get() 返回一个将解析为快照的承诺。你需要等待这个异步函数。

如果在您的上下文中可能,请使用 await 或使用:

anglersRef.where('anglerNumber', '==', newUserNumber).get().then((snapshot)=>{
   //do you processing
});

【讨论】:

  • 谢谢! .then 方法不起作用,但我能够使用您提到的 async/await 替代方法。谢谢你:)
猜你喜欢
  • 1970-01-01
  • 2020-11-05
  • 2017-10-07
  • 2020-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-31
相关资源
最近更新 更多