Ale*_*len 3 firebase typescript google-cloud-functions google-cloud-firestore
尝试批量执行多个更新时,有人会遇到类似的问题吗?这是我的功能:
admin.initializeApp();
const db = admin.firestore();
export const unfollowRemoveUser = functions.https.onCall((data, context) => {
const user1id = data.user1
const user2id = data.user2
const user1DocRef = db.collection('users').doc(user1id)
const user2DocRef = db.collection('users').doc(user2id)
const batch = db.batch();
batch.update(user1DocRef, {followingNum : FieldValue.increment(-1)});
batch.update(user2DocRef, {followersNum : FieldValue.increment(-1)});
// Commit the batch
return batch.commit().then(function () {
// ...
});
});
Run Code Online (Sandbox Code Playgroud)
我的功能有问题吗?我这样做就像在批处理写入的文档示例中一样。我收到此错误:
未处理的错误错误:Update()需要单个JavaScript对象或字段/值对的交替列表,其后可以是可选的前提条件。参数\“ dataOrField \”的值不是有效的Firestore文档。无法序列化类型为“ NumericIncrementTransform \”的对象(可在字段followingNum中找到)。Firestore不支持带有自定义原型的JavaScript对象(即通过\“ new \”运算符创建的对象)。\ n位于WriteBatch.update(/ user_code / node_modules / firebase-admin / node_modules / @ google-cloud / firestore /build/src/write-batch.js:367:23)\n在export.unfollowRemoveUser.functions.https.onCall(/user_code/lib/index.js:131:11)\n在/ user_code / node_modules / firebase -functions / lib / providers / https.js:330:
我搜索并尝试了所有可以找到的但无法解决此问题的方法,甚至尝试对文档使用简单的更新,但出现相同的错误。
编辑 如果要让批处理仅在所有操作都可以成功执行的情况下执行,该怎么办。示例:如果我对确实存在的文档进行前两次更新,它们将以-1更新这些值,然后对不存在的文档进行两次删除操作,这不会对我的函数造成错误(值将由更新-1和delete不会执行任何操作)
const batch = db.batch();
batch.update(user1DocRef, {followingNum : admin.firestore.FieldValue.increment(-1)});
batch.update(user2DocRef, {followersNum : admin.firestore.FieldValue.increment(-1)});
batch.delete(user1FollowingDocRef); //this doesn't exist
batch.delete(user2FollowersDocRef); //this doesn't exist
return batch.commit();
Run Code Online (Sandbox Code Playgroud)
但是,如果我首先对不存在的文档执行两次删除操作,则整个功能将失败
const batch = db.batch();
batch.delete(user1FollowingDocRef); //this doesn't exist
batch.delete(user2FollowersDocRef); //this doesn't exist
batch.update(user1DocRef, {followingNum : admin.firestore.FieldValue.increment(-1)});
batch.update(user2DocRef, {followersNum : admin.firestore.FieldValue.increment(-1)});
return batch.commit();
Run Code Online (Sandbox Code Playgroud)
我认为,只有成功完成所有操作后,批处理中附加的任何内容才会执行
我也有类似的问题FieldValue。正如道格所说,您需要“导入” FieldValue该increment()方法。
您可以内联进行。
batch.update(user1DocRef, {followingNum : admin.firestore.FieldValue.increment(-1)});
batch.update(user2DocRef, {followersNum : admin.firestore.FieldValue.increment(-1)});
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用更短的名称定义一个常量。
admin.initializeApp();
const db = admin.firestore();
const firestore = admin.firestore;
export const unfollowRemoveUser = functions.https.onCall((data, context) => {
const user1id = data.user1
const user2id = data.user2
const user1DocRef = db.collection('users').doc(user1id)
const user2DocRef = db.collection('users').doc(user2id)
const batch = db.batch();
batch.update(user1DocRef, {followingNum : firestore.FieldValue.increment(-1)});
batch.update(user2DocRef, {followersNum : firestore.FieldValue.increment(-1)});
// Commit the batch
return batch.commit().then(function () {
// ...
});
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
638 次 |
| 最近记录: |