firebase 无法获取FieldValue.increment在Firestore模拟器中使用Admin SDK工作

fjaof16o  于 2023-04-07  发布在  其他
关注(0)|答案(2)|浏览(163)

我试图在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
我做错了什么?

of1yzvn4

of1yzvn41#

您使用的是什么版本的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
oknwwptz

oknwwptz2#

这里有一些例子,你可以使用它

const dbFieldValue = require('firebase-admin/firestore');

 const userPayout = Number(reward);
 transaction.update(userRef, { USER_WALLET_AMOUNT: dbFieldValue.FieldValue.increment(userPayout)});

模拟器和生产上的工作

相关问题