无法修改已在环境nodejs中提交的WriteBatch



我正在尝试批量提交,但它没有按预期工作,这是我的代码

exports.test = functions.https.onRequest(async (req, res) => {
const firestore = admin.firestore();
const batch = firestore.batch();
try {
let snapUser = await admin.firestore().collection("users").get();
const batch = firestore.batch();
snapUser.docs.forEach(async (doc) => {
let snapObject = await doc.ref.collection("objects").get();
if (!objectSnapShot.empty) {
objectSnapShot.docs.forEach((doc) => {
batch.set(
doc.ref,
{
category: doc.data().category,
},
{
merge: true,
}
);
});
await batch.commit()
}
});

res.status(200).send("success");
} catch (error) {
functions.logger.log("Error while deleting account", error);
}
});

我做错什么了吗?

如有任何帮助,将不胜感激

await batch.commit()在循环的每个迭代中运行,但您只能提交一次批处理。您必须在执行循环之后提交它。

snapUser.docs.forEach(async (doc) => {
// add operations to batch 
});
await batch.commit()

此外,当使用async-await而不是forEach()循环时,使用for循环可能更好。有关详细信息,请使用带有forEach循环的async/await进行签出。

在提交事务和/或您正在使用同一个batch对象来执行多个提交。如果需要,您可以继续为每次提交创建一个新的batch对象。你可以试着从小处着手,把事情分解,以真正理解这些概念。在异步操作尝试写入WriteBatch之前,它似乎已经关闭。
批处理过程需要有两个部分,一个主函数和一个来自每个批的回调。问题是,一旦提交了第一批处理,您就试图重新声明批处理过程。您的主函数是一个异步函数,它将继续异步运行所有方法,忽略任何内部函数。您必须确保在尝试提交之前添加了应用于批处理的所有作业,这是一个竞争条件
您可以通过多种方式处理这些问题,例如用承诺链包装它或创建回调。查看以下文档以了解管理数据事务。

相关内容

  • 没有找到相关文章

最新更新