首页 > 解决方案 > Firebase 函数问题以及 .add() 与 .doc().set() 之间的区别

问题描述

几周以来我面临以下问题(以前不是问题):

1 .add(数据)

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() 吗?

标签: javascriptfirebasegoogle-cloud-firestoregoogle-cloud-functions

解决方案


我发现的原因很简单明了:

add()返回Promise<FirebaseFirestore.DocumentReference>同时 set()返回`Promise

添加新文档的操作以任何一种方式工作,但一旦完成,响应将被发送回客户端,文档引用或包装在承诺中的写入结果。由于响应中只允许使用有效的 JSON,因此返回文档引用将导致错误,因为它不是有效的 JSON 格式。

因此,一旦操作完成,要么解析一个空的 Promise,要么将结果转换为有效的 JSON,然后再将其包装到响应中 - 或使用 set()。


推荐阅读