Firestore FieldValue.arrayUnion在Cloud Function中不起作用

时间:2018-11-23 08:16:27

标签: arrays firebase google-cloud-firestore google-cloud-functions

我尝试使用Firestore的arrayUnion功能将项目添加到Array。 我有一个Web应用程序,下面的代码工作正常,并将元素添加到MyArray中:

firebase.firestore().collection("MyCollection").doc("MyDocument").update({
     MyArray: firebase.firestore.FieldValue.arrayUnion({element1: "qqq", element2: "www"})
});

但是,当我尝试使其在云函数中运行时,该代码不执行任何操作。我的Firestore阵列中没有写入任何内容,并且云功能日志上也没有错误。

初始化:

const admin = require('firebase-admin');
admin.initializeApp();

我的云功能具有HTTP触发器,可以正常工作。云功能中的代码是:

admin.firestore().collection("MyCollection").doc("MyDocument").update({
     MyArray: admin.firestore.FieldValue.arrayUnion({element1: "qqq", element2: "www"})
});

在相同的HTTP触发的云函数中,添加了具有简单元素的相同代码的效果很好:

admin.firestore().collection("MyCollection").doc("MyDocument").update({
     element1: "qqq"
});

似乎admin.firestore.FieldValue.arrayUnion没有任何作用。

完整的云功能可以很好地部署:

exports.test = functions.https.onRequest((req, res) => {
   admin.firestore().collection("MyCollection").doc("MyDocument").update({

       MyArray: admin.firestore.FieldValue.arrayUnion({element1: "qqq", element2: "www"})

   });
   res.status(200).end();
});

他是我的package.json文件,所有软件包都是最新的:

{
   "name": "functions",
   "description": "Cloud Functions for Firebase",
   "scripts": {
   "serve": "firebase serve --only functions",
   "shell": "firebase experimental:functions:shell",
   "start": "npm run shell",
   "deploy": "firebase deploy --only functions",
   "logs": "firebase functions:log"
},
"dependencies": {
   "@google-cloud/storage": "^1.7.0",
   "admin": "^1.4.0",
   "firebase": "^5.5.9",
   "firebase-admin": "^6.2.0",
   "firebase-functions": "^2.1.0",
   "firestore": "^1.1.6",
},
"private": true
}

我想念什么吗?非常感谢!

1 个答案:

答案 0 :(得分:0)

感谢Renaud和Doug,它在Promise的帮助下工作正常:

exports.test = functions.https.onRequest((req, res) => {

return admin.firestore().collection("MyCollection").doc("MyDocument").update({

    MyArray: admin.firestore.FieldValue.arrayUnion({
        element1: "qqq",
        element2: "www"
    })

   }).then(() => {
    console.log('Write succeeded!');
    res.status(200).end();
   });

});

清除功能会杀死所有内容,我不认为发送状态200会清除所有过程。但是有一件事很奇怪:仅更新一个元素就可以正常工作,但是不能更新Array……这当然是由于更复杂的过程的执行时间:更新Array ... < / p>