Firestore触发器函数同步文档报错:数据参数无效问题排查
问题:Firestore触发器同步文档时的类型错误
我希望通过Firebase触发器函数将Firestore文档同步至另一个集合,编写了如下代码:
exports.foo = functions .region("foo") .firestore.document("foo") .onWrite((events, context) => { return new Promise((resolve, reject) => { if (events.after.exists) { // on create or update admin .firestore().doc("newFoo") .set(events.after.data) .then(() => { resolve(true); }) .catch((ex) => { reject(ex); }); } else{ // on delete admin .firestore() .doc("newFoo") .delete() .then(() => { resolve(true); }) .catch((ex) => { reject(ex); }); } }); });
但手动编辑Firestore文档时出现如下错误:
Error: Value for argument "data" is not a valid Firestore document.
Input is not a plain JavaScript object.
疑问:events.after.data返回的是FirebaseFirestore.DocumentData,这应该是doc.set()的正确数据类型,为何会出现该错误?
解决方法
你犯了一个基础错误:events.after.data是方法而非属性,必须调用它才能获取文档数据,也就是要写成events.after.data()。
直接传递events.after.data时,你实际上把函数本身传给了set()方法,而不是函数返回的DocumentData对象,这就导致Firestore判定传入的不是合法的纯JS对象,从而抛出错误。
修正后的代码如下:
exports.foo = functions .region("foo") .firestore.document("foo") .onWrite((events, context) => { return new Promise((resolve, reject) => { if (events.after.exists) { // on create or update admin .firestore().doc("newFoo") .set(events.after.data()) // 此处添加()调用方法 .then(() => { resolve(true); }) .catch((ex) => { reject(ex); }); } else{ // on delete admin .firestore() .doc("newFoo") .delete() .then(() => { resolve(true); }) .catch((ex) => { reject(ex); }); } }); });
补充说明:data()方法返回的DocumentData本质就是符合要求的纯JavaScript对象,完全适配set()方法的参数要求,修正后即可正常同步文档。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

