gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 15:58:08 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com