我正在尝试使用 Firestore 触发器在 Firebase Cloud Functions 中实现简单的原子增加/减少。 为了测试这些,我想使用 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
这会导致错误,因为如果我只是输入硬编码的数字而不是 decrement
在更新调用中,它可以工作(更新到该硬编码数字)。
我使用的是 Firebase CLI 7.2.1 和模拟器 1.6.2 - 根据 Most efficient way to increment a value of everything in Firebase和 https://github.com/firebase/firebase-js-sdk/issues/1799应该支持FieldValue.increment
在模拟器中。
我做错了什么?
最佳答案
您使用的 firebase-admin
版本是什么?
根据您的描述,听起来您是直接从 Node.js 脚本调用 perform()
。我建议重新设置您的设置,以更紧密地匹配生产中实际发生的情况:客户端将直接连接到 Firestore,创建一个文档,然后您的函数将被触发。
这是一个您可以运行的示例:
const admin = require('firebase-admin');
const functions = require('firebase-functions');
admin.initializeApp();
exports.createItem = functions.https.onRequest(async (request, response) => {
const item = await admin.firestore().collection("items").add({ addedAt: Date.now() });
response.send(`added ${item.id}\n`);
});
const counter = admin.firestore().collection("counters").doc("items");
exports.increment = functions.firestore.document('items/{itemId}').onCreate(async (change, context) => {
await counter.set({ total: admin.firestore.FieldValue.increment(1) }, { merge: true });
const current = await counter.get();
console.log(`incremented counter to ${current.data().total}`);
});
第一个函数 createItem
是一个 HTTP 触发器,它将文档添加到 items/
集合中。第二个函数是 Firestore 触发器,每当创建文档时,它就会递增 counters/items
文档中的字段。
当我运行时
curl -X POST http://localhost:5001/ryanpbrewster-test/us-central1/createItem
它创建一个文档并发送类似的响应
added LGOCapHSQtlXKIMEA8Do
这会触发另一个函数,我可以在模拟器日志中看到该函数:
I function: Beginning execution of "increment"
> incremented counter to 6
I function: Finished "increment" in ~1s
关于node.js - 无法使用 Admin SDK 在 Firestore 模拟器中获取 FieldValue.increment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57232382/