如何更新DocumentReference?

问题描述 投票:1回答:3

我试图更新DocumentReference,但无法做到。

update()方法失败。如何使用它? (如何传递参数?)

firebase-admin版本是6.3.0。 @google-cloud/firestore版本是0.19.0。

❯ firebase functions:shell
i  functions: Preparing to emulate functions.
Warning: You're using Node.js v8.14.0 but Google Cloud Functions only supports v6.11.5.
✔  functions: sampleFunc
firebase > const admin = require('firebase-admin');
firebase > admin.initializeApp();
firebase > let ref = admin.firestore().collection("users").doc('edqupYQhzqV1ODjEpoJn');
firebase > let updates = { email: '[email protected]' };
firebase > ref.update(updates).then(value => console.log(value) );
Error: Update() requires either a single JavaScript object or an alternating list of field/value pairs that can be followed by an optional precondition. Argument "dataOrField" is not a valid Document. Input is not a plain JavaScript object.
    at WriteBatch.update (/Users/xxx/Desktop/sample-functions/functions/node_modules/@google-cloud/firestore/build/src/write-batch.js:359:23)
    at DocumentReference.update (/Users/xxx/Desktop/sample-functions/functions/node_modules/@google-cloud/firestore/build/src/reference.js:387:14)

更新 文档已经创建,所以get()工作。

firebase > ref.get().then(snapshot => console.log(snapshot.data()));

set()也会出现错误。

firebase > ref.set({email: '[email protected]'}, {merge: true}).then(value => console.log(value));
Error: Argument "data" is not a valid Document. Input is not a plain JavaScript object.
    at Validator.(anonymous function).values [as isDocument] (/Users/xxx/Desktop/sample-functions/functions/node_modules/@google-cloud/firestore/build/src/validate.js:99:27)
    at WriteBatch.set (/Users/xxx/Desktop/sample-functions/functions/node_modules/@google-cloud/firestore/build/src/write-batch.js:232:25)
    at DocumentReference.set (/Users/xxx/Desktop/sample-functions/functions/node_modules/@google-cloud/firestore/build/src/reference.js:349:27)
node.js google-cloud-firestore firebase-admin
3个回答
0
投票

按照您发布的示例,您正在尝试更新不存在的文档。在这种情况下,您应该首先创建它。

如果您不确定文档是否存在,请传递选项以将新数据与任何现有文档合并,以避免覆盖整个文档。

来自Google的文档:

var cityRef = db.collection('cities').doc('BJ');

var setWithOptions = cityRef.set({
  capital: true
}, {merge: true});

参考:Firestore Add Data


0
投票

我从未尝试在函数中使用Admin SDK:shell就像在您的示例中一样。但是,我可以轻松地重现您的错误。我想功能:shell以某种方式篡改你的变量updates。当我记录updates undefined在输出中连接

firebase > console.log(updates)
{ email2: '[email protected]' }
undefined

如果您将代码放在JS文件中,使用服务帐户初始化您的应用程序并使用节点运行它很可能会正常工作!

Read more about how to use Service Account


0
投票

首先创建一个对象,然后将值分配给该对象上的字段/属性,如:

var myObj = {};
myObj["myfield"] = myvalue;

现在作为.set.update的第二个参数传递。

© www.soinside.com 2019 - 2024. All rights reserved.