首页 > 解决方案 > 使用回调返回未定义的 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

即使我没有在我的工作人员内部做任何事情并尽快调用回调,我也会收到错误消息。

所以我理解这些功能需要一个响应、承诺或价值。但这就像我不再在范围内,但我不想在工作完成之前返回!

有什么帮助吗?感谢你们

标签: node.jsfirebasegoogle-cloud-firestoregoogle-cloud-functions

解决方案


您执行的所有异步工作都应该由一个 Promise 表示。如果您有一个执行异步工作的实用程序对象,它应该返回一个承诺,以便调用者可以决定下一步如何处理它。现在你只是在使用回调,这会使事情变得比必要的困难得多(因为你必须“承诺”这些回调)。

只要在任何地方使用 Promise,你的函数应该如何工作就会更加清晰。


推荐阅读