node.js - 使用回调返回未定义的 Firestore onWrite 触发器
问题描述
我试图在我的云功能上添加触发功能。
当文档更改时,我想执行一些工作。我已经在另一个文件中完成了工作的代码(我将我的工作分成文件,所以对我来说更容易),所以我有一个执行工作的函数,当它完成时调用回调。
这就是我的 index.js 的样子:
// requires...
// Express, i also use express for simulating an API
const app = express()
// So there is my Listener
const listenerForChange = functions.firestore
.document('myPath/documentName')
.onWrite((change, context) => {
const document = change.after.exists ? change.after.data() : null;
if (document != null) {
const oldDocument = change.before.data();
const newDocument = change.after.data()
// Here i call my function that is in the worker-listeners.js
listenerWorker.performStuff(newDocument, function() {
return 0
})
}
else {
console.error("Listener for classic was triggered but doc does not exist")
return 0
}
});
const api = functions.https.onRequest(app)
module.exports = {
api,
listenerForChange
}
...
有我的 listenerWorker.js :
module.exports = {
performStuff: function(data, complete) {
performStuff(data, complete)
}
};
function performStuff(data, complete) {
// do stuff here ...
complete()
}
问题是我总是在 Firebase 控制台中出错:Function returned undefined, expected Promise or value
即使我没有在我的工作人员内部做任何事情并尽快调用回调,我也会收到错误消息。
所以我理解这些功能需要一个响应、承诺或价值。但这就像我不再在范围内,但我不想在工作完成之前返回!
有什么帮助吗?感谢你们
解决方案
您执行的所有异步工作都应该由一个 Promise 表示。如果您有一个执行异步工作的实用程序对象,它应该返回一个承诺,以便调用者可以决定下一步如何处理它。现在你只是在使用回调,这会使事情变得比必要的困难得多(因为你必须“承诺”这些回调)。
只要在任何地方使用 Promise,你的函数应该如何工作就会更加清晰。
推荐阅读
- image - 有没有办法用 Symfony/Panther 测试图像上的链接
- asp.net-core - Windows 关闭时服务未调用 OnShutdown()
- python - 熊猫数据框根据列总数对列进行排序
- nuxt.js - 如何在 nuxt.config 生成路由时使用 view-i18n 翻译 url 参数
- nativescript - RadDataForm:我可以将编辑器类型 AutoCompleteInline 设置为匹配建议的子字符串吗?
- ios - UILabel 字体与 NSAttributedString 字体
- python - pyglet window.flip() 不更新
- android - 任何在数据类 kotlin 中不起作用的数据类型
- php - htaccess 重定向所有路由以 xxx 查询字符串开头
- svn - 我把我的办公室搬到另一个地方并更改了我的 IP 地址,我无法再连接到 svn 服务器了