【问题标题】:Can't set number on Firestore document无法在 Firestore 文档上设置数字
【发布时间】:2021-12-04 16:21:44
【问题描述】:

我正在尝试在 Firestore 上设置一个带有数字字段的文档。 我刚刚关注了an example from the official document of Firestore

import * as admin from 'firebase-admin';
admin.initializeApp({
  /* I set here properly */
});

const db = admin.firestore();

function setPost() {
  const docRef = db.collection('posts').doc();
  await docRef.set({
    postId: v4(), // uuid
    createdAt: Date.now(), // it is a number. and it occurs an error.
  });
};

错误

失败:13 内部:请求消息序列化失败:util.Long.fromValue 不是函数 错误:13 内部:请求消息序列化失败:util.Long.fromValue 不是函数

如果我用${} 包裹Date.now(),效果很好。

await docRef.set({
  postId: v4(), // uuid
  createdAt: `${Date.now()}`, 
});

更新

我也尝试了下面的代码,但仍然抛出同样的错误。

await docRef.set({
  postId: v4(), // uuid
  createdAt: 123, 
});

【问题讨论】:

  • 你能指出你在哪里找到了这个具体的例子吗?
  • @AlexL 我添加了一个示例链接。
  • 嘿,您提到的链接不使用Date.now(),而是使用new Date(),更具体地说,在node.js 调用中它指定了一个Timestamp.fromDate 函数,用于转换日期值转换为 Firestore 可以轻松接受的时间戳。 (更重要的是,您收到的错误消息似乎类似于 this case ,其中一些其他库正在覆盖来自 utilLong)。因此,如果不是 node.js,您从文档中遵循了哪些示例?
  • @fabc 感谢您的回答,但我将Date.now() 更改为简单的数字,例如1123,但它仍然无法使用相同的错误。
  • 您没有阅读@fabc 提供的链接。 Node 中的问题,特别是与数字参数有关(即long)。您避免错误的一种方法将值转换为字符串,即对象文字``` $${Date.now()} ``` 这显然可以避免protobuf调用util.long的需要。升级节点 package.json。

标签: node.js firebase google-cloud-firestore


【解决方案1】:

似乎是您项目中“Long”本身的错误。在其他问题上,长包的版本似乎是旧的,你必须更新它,即使手动(看看长包,如果有的话,在 node_modules 中),可能是另一个包使用了旧的一。如果您之前没有看到它们,请查看以下问题:
https://stackoverflow.com/a/57499044/13058371
https://github.com/grpc/grpc-node/issues/1472

【讨论】:

  • 你是对的。我做了npm audit,它被修复了。
【解决方案2】:

正如https://stackoverflow.com/a/57499044/2434784 中所述,该问题是 Node 中的包冲突,具体与数字参数有关(即long)。您避免错误的一种方法将值转换为字符串,即对象文字`${Date.now()}`,这显然可以避免protobuf调用util.long的需要。升级节点 package.json。

【讨论】:

    猜你喜欢
    • 2019-07-22
    • 2019-12-30
    • 1970-01-01
    • 2021-12-29
    • 2018-12-24
    • 1970-01-01
    • 1970-01-01
    • 2020-11-30
    • 1970-01-01
    相关资源
    最近更新 更多