我尝试更新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: 'xxx@yyy.zzz' };
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: 'aaa@bbb.ccc'}, {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)
答案 0 :(得分:0)
按照您发布的示例,您正在尝试更新不存在的文档。在这种情况下,您应该先创建它。
如果不确定文档是否存在,请传递选项以将新数据与任何现有文档合并以避免覆盖整个文档。
摘自Google文档:
var cityRef = db.collection('cities').doc('BJ');
var setWithOptions = cityRef.set({
capital: true
}, {merge: true});
答案 1 :(得分:0)
我从未尝试像在示例中那样在functions:shell中使用Admin SDK。但是,我可以轻松地重现您的错误。我猜想function:shell会以某种方式篡改您的变量updates
。当我登录updates
时,未定义在输出中串联
firebase > console.log(updates)
{ email2: 'xxx@yyy.zzz' }
undefined
如果将代码放在JS文件中,请使用服务帐户初始化您的应用并在node上运行,它很可能就可以正常工作!
答案 2 :(得分:0)
首先创建一个对象,然后将值分配给该对象的字段/属性,例如:
var myObj = {};
myObj["myfield"] = myvalue;
现在作为.set
或.update
的第二个参数传递。