0

我正在尝试实现一个 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 函数中运行它时,我看到 console.log 打印出了一个好的 URL。我还看到了构建的 SSML 字符串,但我从未听到过该短语并且 Lambda 函数超时(即使有 20 秒的超时)。如果我注释掉 getDownloadURL 行,函数返回就好了。另外,如果我在 Lambda 之外运行jovo run它,它在那里也可以正常工作。

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

4

2 回答 2

1

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

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

我需要通过将 callbackWaitForEmptyEventLoop 设置为 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 行为是让某些连接保持打开状态(我相信是出于无服务器性能的原因),并且此更改会修改该行为。

于 2019-12-16T15:07:41.990 回答
0

如图console.log所示,getDownloadURL()工作正常。异步小说应该返回承诺。我认为您缺少类似return url. 请检查此问题以了解异步用法:此处

于 2019-12-13T14:28:55.187 回答