几周以来我遇到了以下问题(以前不是问题):
1.添加(数据)
const saveNewDoc = functions.https.onCall((data: NewDocWrite, context: CallableContext) => {
return adminDb
.collection(data.collectionPath)
.add(data.data)
})
文档已成功创建,但仍有错误“INTERNAL”返回给客户端,并且也在函数日志中列出:
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()
by doc().set()
创建文档时没有任何错误。
知道为什么会发生这种情况吗? “解决方法”很简单,只需使用 doc().set() 但我想知道为什么还有 add() 。我们不能对任何新文档使用 doc().set() 吗?
with set
您正在选择一个文档(您分配自己的 ID)并且add
您正在让 firestore 为您分配一个 id。
这里有一个小(不是那么小的)细节,您的可调用函数应该返回一个承诺,该承诺通过发送到客户端的响应进行解析,您的函数返回一个在对数据库进行操作后解析的承诺。
您的代码抱怨的行如下所示:
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,但将其留空也可以。尝试一下,避免返回针对数据库执行程序的承诺应该是好的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)