Javascript node.js异步azure队列存储输出绑定

Javascript node.js异步azure队列存储输出绑定,javascript,azure-functions,Javascript,Azure Functions,我试图创建一个JS函数,该函数从存储器读取文件,将其内容写入数据库,并将结果消息推送到队列。读取和数据库处理正常,但写入队列时不会发生任何事情 代码如下: process(file) .then(() => { context.bindings.outQueue = { file }; return context.log('File processing completed successfully'); }) .catch(err

我试图创建一个JS函数,该函数从存储器读取文件,将其内容写入数据库,并将结果消息推送到队列。读取和数据库处理正常,但写入队列时不会发生任何事情

代码如下:

    process(file)
   .then(() => {
      context.bindings.outQueue = { file };
      return context.log('File processing completed successfully');
    })
    .catch(err => context.log.error(err));
如果改用context.done(),则会出现以下错误:

Error: Choose either to return a promise or call 'done'.  Do not use both in your script.
无论哪种情况,都不会将消息写入队列。
出了什么问题?

有几件事最有可能导致您出现问题首先,您应该在函数的主范围内返回。不返回将导致函数应用程序挂起,这可能是您尝试添加context.done()的原因其次,当context.done()可能过早返回时,不应调用它。您看到的错误消息试图阻止您这样做第三,您应该返回链接承诺,而不是调用context.done()`。这将使您能够正确写入队列

关于第一点:我认为您假设返回
的内部,然后(()=>{…})正在返回范围更大的函数。请记住,传入.then()方法的lambda函数只是返回一个实现值,用于将一个承诺的结果传递给另一个承诺(docs)。作为补充说明,我建议不要返回
context.log(“文件处理已成功完成”)(只需调用它,不要返回它),因为这与返回void相同,但会导致更混乱的代码

第二点:在
的内部调用context.done(),然后(()=>{…})
正在调用一个方法,以指示main函数来自一个fork'd异步函数。这是危险的,因为理论上,在
之后的任何一点(()=>{…}),则对context.done()的调用可能会终止主函数代码

第三点:如果只在main函数的作用域中调用context.done(),而不返回承诺,则会出现与第2点相反的问题(在异步代码完成之前,主代码将退出并停止执行fork'd异步任务)

下面是一个简单JS函数的示例,它等待承诺并写入队列:

示例:

module.exports = function (context, req) {
     context.log("Starting function");

    // Mock Promise
    let doWork = new Promise(
       (resolve, reject) => {
            setTimeout(resolve, 100, 'foo');
            console.log("Work in promise");
        }
    );

    doWork.then(() => {
        context.log("Work AFTER promise");
        context.bindings.queue1= "Queue message";
        context.log("Message queued!");
    }).catch(err => context.log.error(err));

    // This is the correct scope to return promise
    return doWork;
};
如果不兑现承诺,
context.done()?分配输出后是否调用
context.done