node.js - 无法使用 Admin SDK 在 Firestore 模拟器中获取 FieldValue.increment

标签 node.js firebase google-cloud-firestore google-cloud-functions firebase-cli

我正在尝试使用 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 Firebasehttps://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/

相关文章:

swift - 如何在不重新加载 Controller 的情况下更新用户在线状态?

node.js - 如何在azure devops管道中为node js构建作业设置环境变量

angularjs - 将数据发布到 mongoDb 后如何取回 id?

arrays - 如何快速按日期对字典数组中的项目进行排序

javascript - Firebase 验证并重置密码,无需发送单独的邮件

swift - 在 Firebase Swift 中检查和比较消息的时间

firebase - Flutter:上传图像未处理的异常:PlatformException(firebase_storage,存储 Uri 不能包含路径元素。,{},null)

更新 Firestore 数据库时 Android Studio Kotlin 空指针异常

node.js - 将expressApp.ts转换为对 Node 友好的需求

node.js - 无法在 Telegram Bot 中发送对象