如何退出调用 Firebase 存储的 lambda 函数?



我正在尝试实现一项Alexa技能(与Jovo一起编写(,该技能可以访问我们存储在Google的Firebase存储中的音频文件。 但是,无论我给出什么超时值,我都无法返回 lambda 函数。 我相信我的问题在于我如何在 Lambda 中处理异步代码,但我无法找出我正在尝试执行的操作的正确语法,尤其是在 Jovo 框架中。

这是一些有问题的代码版本。 在实际代码中,它将 url 传递给音频播放器,但此示例演示问题要简单得多:

app.setHandler({
async LAUNCH() {
firebase.initializeApp(firebaseConfig);
const storageFiles = firebase.storage().ref().child('EN');
const storageFile = storageFiles.child('1.mp3');
const url = await storageFile.getDownloadURL();
console.log(`My URL: ${url}`);
this.tell(`Ok, done with getting the URL`);
},
... More Jovo intent calls ...
});
module.exports.app = app;

当我在 Lambda 函数中运行它时,我看到控制台.log并打印出一个很好的 URL。 我还看到了构造的 SSML 字符串,但我从未听到过该短语,并且 Lambda 函数超时(即使超时为 20 秒(。 如果我注释掉getDownloadURL行,该函数返回就可以了。 另外,如果我在 Lambda 外部运行它jovo run,它在那里也可以正常工作。

底线:我需要做什么才能在lambda函数中使用getDownloadURL((方法?

我已经找到了解决问题的方法。 Jovo 框架创建了一个如下所示的 Lambda 处理程序函数(在 index.js 中(:

// AWS Lambda
exports.handler = async (event, context, callback) => {
await app.handle(new Lambda(event, context, callback));
};

我需要通过将回调 WaitForEmptyEventLoop 设置为 false 来更改默认的 Lambda 行为。 处理程序函数现在如下所示:

// AWS Lambda
exports.handler = async (event, context, callback) => {
context.callbackWaitsForEmptyEventLoop = false;
await app.handle(new Lambda(event, context, callback));
};

进行此更改后,我能够成功地从Firebase存储中获取URL,并通过Lambda函数在Alexa音频播放器上播放它们。 默认的 Lambda 行为是保持某些连接处于打开状态(我相信出于无服务器性能的原因(,此更改会修改该行为。

由于console.log显示正确,getDownloadURL()工作正常。异步小说应该回报承诺。我认为你错过了像return url这样的东西. 请检查此问题以了解异步用法:这里

最新更新