javascript - 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() 吗?
解决方案
我发现的原因很简单明了:
add()
返回Promise<FirebaseFirestore.DocumentReference>
同时
set()
返回`Promise
添加新文档的操作以任何一种方式工作,但一旦完成,响应将被发送回客户端,文档引用或包装在承诺中的写入结果。由于响应中只允许使用有效的 JSON,因此返回文档引用将导致错误,因为它不是有效的 JSON 格式。
因此,一旦操作完成,要么解析一个空的 Promise,要么将结果转换为有效的 JSON,然后再将其包装到响应中 - 或使用 set()。
推荐阅读
- laravel - 多个数据透视表 laravel 雄辩
- opengl - OpenGL/C++:将多个纹理传递给一个着色器的问题
- python - 无法通过 HTTP 下载文件 - 会话挂起
- ruby - 无法使用 ruby 关闭 sqlite3 数据库
- python - 在 PyQt 中关闭窗口后如何检索属性值?
- angularjs - AngularJs 使用 Gulp 和 Docker NGINX 镜像构建生产环境
- javascript - 如何为与当前值一起滑动的滑块制作标签?
- python - 在 Python 数据框中的另一列中找到两次出现的值之间的列的最小值
- android - 我如何获得最后一个 sql id?
- azure - 密码重置用户流帐户不存在错误