我试图在Firebase Cloud Functions中使用Firestore触发器进行简单的原子增加/减少。为了测试这些,我想使用Firestore模拟器执行本地测试。
但我总是得到错误FirebaseError: Function DocumentReference.update() called with invalid data. Unsupported field value: a custom object (found in field myfield)
我的代码如下所示
import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
admin.initializeApp();
export const mytest = functions.firestore.document('my/{doc}').onUpdate(async (change, context) => {
return perform();
});
export async function perform(): Promise<FirebaseFirestore.WriteResult> {
const myDocRef = .... // this is a FirebaseFirestore.DocumentReference
const decrement = admin.firestore.FieldValue.increment(1);
return myDocRef.update({
myfield: decrement
});
}
在我的测试中,我只是调用了perform
函数,然后我收到了上面的错误。这肯定是FieldValue.increment
导致的错误,因为如果我只是在update调用中放入一个硬编码的数字而不是decrement
,它就可以工作(更新到那个硬编码的数字)。
我在Firebase CLI 7.2.1和模拟器1.6.2上-根据在Firebase和https://github.com/firebase/firebase-js-sdk/issues/1799中增加所有值的最有效方法应该在模拟器中支持FieldValue.increment
。
我做错了什么?
2条答案
按热度按时间of1yzvn41#
您使用的是什么版本的
firebase-admin
?从你的描述中,听起来像是你直接从Node.js脚本调用
perform()
。我建议你重新设置,以更接近生产中实际发生的情况:客户端将直接连接到Firestore,创建一个文档,您的函数将被触发。这里有一个例子,你可以运行它来做到这一点:
第一个函数
createItem
是一个HTTP触发器,它将一个文档添加到items/
集合中。第二个函数是Firestore触发器,每当创建一个文档时,它就递增counters/items
文档中的一个字段。当我跑的时候
它会创建一个文档并发送一个响应
这会触发另一个函数,我可以在模拟器日志中看到:
oknwwptz2#
这里有一些例子,你可以使用它
模拟器和生产上的工作