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

问题描述 投票:0回答:2

我正在尝试实施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行,该函数将返回正常。另外,如果我使用jovo run在Lambda之外运行此代码,那么在这里也可以正常运行。

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

lambda google-cloud-firestore alexa jovo-framework
2个回答
0
投票

console.log正确显示,getDownloadURL()工作正常。异步小说应该返回承诺。我认为您缺少return url之类的东西。请检查此问题以了解异步用法:here


0
投票

我找到了解决我问题的方法。 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的默认行为是使某些连接保持打开状态(我相信出于无服务器性能的原因),此更改将修改该行为。

© www.soinside.com 2019 - 2024. All rights reserved.