Firestore云函数以参数更新集合中所有文档中的字段。

6 浏览
0 Comments

Firestore云函数以参数更新集合中所有文档中的字段。

我有一个名为"Messages"的Firestore集合,其中包含一个布尔字段"viewed"和一个包含coll:Users引用的字段"userToRef"。我希望我的云函数能够将"userToRef"字段中与URL参数"userRef"相同的用户引用的所有文档中的"viewed"字段更新为"True"。

但无论我做什么,都会引发404错误

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
exports.allMsgOfUserRead = functions.https.onRequest((req, res) => {
  // 从请求中获取文档的用户引用
  const strRef = req.query.userRef;
  const userRef = admin.firestore().collection('Users').doc(strRef);
  // 更新"Messages"集合中所有文档的"viewed"字段,
  // 其中"userToRef"字段与用户引用匹配
  return admin.firestore()
    .collection('Messages')
    .where('userToRef', '==', userRef)
    .get()
    .then(snapshot => {
      if (!snapshot.exists) {
        // 文档不存在,返回错误响应
        return res.status(404).json({
          message: `未找到发送给用户的消息 ${req.query.userRef}`,
          code: 404
        });
      }
      snapshot.forEach(doc => {
        doc.ref.update({ viewed: true });
      });
      return res.json({
        message: '成功',
        code: 200
      });
    })
    .catch(error => {
      return res.status(500).json({
        message: '发生错误',
        code: 500
      });
    });
});

我真的需要一个理由,为什么会发生这种情况...谢谢!

0
0 Comments

问题的原因是在forEach循环中执行了一组异步update()方法的调用,应该使用Promise.all()来处理。此外,还需要注意QuerySnapshot始终存在并且可能为空,可以使用empty属性进行检查。

解决方法是使用async/await关键字来简化和清理代码。在代码中添加了一个if块,使用async/await可以使代码更加简单。

最后的备注是QuerySnapshot很可能只包含0个或1个QueryDocumentSnapshot,所以不需要循环。如果QuerySnapshot不为空,可以使用snapshot.docs[0]来获取唯一的文档。

文章内容如下:

在Firestore云函数中更新集合中所有文档的字段

在Firestore云函数中,我们经常需要对集合中的所有文档进行批量更新。下面是一个示例的云函数代码,用于更新Messages集合中与给定用户相关的所有消息文档的viewed字段为true。

exports.allMsgOfUserRead = functions.https.onRequest(async (req, res) => {
    try {
        // 从请求中获取用户引用的id
        const strRef = req.query.userRef;
        const userRef = admin.firestore().collection('Users').doc(strRef);
        // 更新Messages集合中所有userToRef字段与用户引用匹配的文档的viewed字段为true
        const snapshot = await admin.firestore()
            .collection('Messages')
            .where('userToRef', '==', userRef)
            .get();
        if (snapshot.size === 0) {
            // 文档不存在,返回错误响应
            res.status(404).json({
                message: `Messages to User not found ${req.query.userRef}`,
                code: 404
            });
        } else {
            const promises = [];
            snapshot.forEach(doc => {
                promises.push(doc.ref.update({ viewed: true }));
            });
            await Promise.all(promises);
            res.json({
                message: 'Success',
                code: 200
            });
        }
    } catch (error) {
        res.status(500).json({
            message: 'Error occurred',
            code: 500
        });
    }
});

此外,我们还可以通过使用async/await关键字来简化和清理代码。在上述代码中,我们使用了async/await来处理异步操作,使代码更加简单。

另外需要注意的是,QuerySnapshot很可能只包含0个或1个QueryDocumentSnapshot,所以不需要使用循环。如果QuerySnapshot不为空,我们可以使用snapshot.docs[0]来获取唯一的文档。

以上就是在Firestore云函数中更新集合中所有文档的字段的原因和解决方法。希望对你有所帮助!

0
0 Comments

问题的原因是使用admin.firestore().collection('Users').doc(strRef)作为搜索代码.where('userToRef', '==', userRef)中的键时,可能无法获得预期的结果。解决方法是使用req.query.userRef作为键来替代。

实际上,你可以使用DocumentReference来查询一个集合。参考stackoverflow.com/a/53141199/3371862

0