javascript - Firebase 函数问题以及 .add() 与 .doc().set() 之间的区别

标签 javascript firebase google-cloud-firestore google-cloud-functions

几周以来我遇到了以下问题(以前不是问题):

1.添加(数据)

const saveNewDoc = functions.https.onCall((data: NewDocWrite, context: CallableContext) => {
  return adminDb
    .collection(data.collectionPath)
    .add(data.data)
})

文档已成功创建,但仍有一个错误“内部”返回给客户端,并在函数日志中列出:

Unhandled error RangeError: Maximum call stack size exceeded
    at baseIteratee (/srv/node_modules/lodash/lodash.js:3464:26)
    at getIteratee (/srv/node_modules/lodash/lodash.js:5932:33)
    at Function.map (/srv/node_modules/lodash/lodash.js:9556:31)
    at encode (/srv/node_modules/firebase-functions/lib/providers/https.js:236:18)
    at /srv/node_modules/lodash/lodash.js:13402:38
    at /srv/node_modules/lodash/lodash.js:4911:15
    at baseForOwn (/srv/node_modules/lodash/lodash.js:2996:24)
    at Function.mapValues (/srv/node_modules/lodash/lodash.js:13401:7)
    at encode (/srv/node_modules/firebase-functions/lib/providers/https.js:242:18)
    at /srv/node_modules/lodash/lodash.js:13402:38

2.doc().set(数据)

add() 替换为 doc().set() 可创建没有任何错误的文档。

知道为什么会这样吗? “解决方法”很简单,只需使用 doc().set() 但我想知道为什么那时还有 add() 。我们不能只对任何新文档使用 doc().set() 吗?

最佳答案

使用 set 您可以选择一个文档(您分配自己的 ID),使用 add 您可以让 firestore 为您分配一个 id。

这里有一个小(不是那么小)的细节,您的可调用函数应该返回一个 promise ,该 promise 通过响应发送给客户端,您的函数返回一个 promise ,该 promise 在对数据库进行操作后得到解决。

您的代码提示的行如下所示:

if (_.isArray(data)) {
  return _.map(data, encode);
}

与您使用的方法相比,我会更加关注您发送的数据。

const saveNewDoc = functions.https.onCall(async (data: NewDocWrite, context: CallableContext) => {
  await adminDb.collection(data.collectionPath).add(data.data)
  // OR
  await adminDb.collection(data.collectionPath).doc().set(data.data)
  return Promise.resolve({ ok: true })

})

实际上 doc().set() 等同于 .add(),我通常使用 set 因为我喜欢控制在我设置的文档 ID 上,但也可以将其留空。试试看,避免返回对数据库执行者的 promise 应该是好的。

关于javascript - Firebase 函数问题以及 .add() 与 .doc().set() 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56562461/

相关文章:

javascript - 作为 Javascript 参数的变量和表达式

swift - 为什么 Firestore 返回我的 where 查询中的所有记录

java - 如何从内部具有监听器的 Jersey REST api 方法返回响应

node.js - 如何处理 firebase 事务 api 上的空值

firebase - 如何使用 flutter 在另一种状态下使用构造函数对象

javascript - 谷歌地图 API JavaScript : nearbysearch callback function not calling

javascript - 检查二维数组中是否存在值

javascript - 没有值的 VueJs 单选按钮会打开所有单选输入元素

javascript - 带有 Firebase/Firestore 后端的双向无限滚动

firebase - Firestore导入数据库