我正在尝试从Lambda函数(对于Alexa技能)查询DynamoDB表,但是当我发送调用 require('aws-sdk')
的intent时,该技能似乎挂起并超时 . Alexa测试页面只是说"There was a problem with the requested skill's response",我确定's not an uncaught exception. I'也试图在 try/catch
块中包装 require
,但这也不起作用 .
如果收到测试数据库意图请求,则此模块将加载 require
:
const AWS = require('aws-sdk');
module.exports = () => {
return 'Success!';
};
如果我注释 require('aws-sdk')
,则该功能正常工作,Alexa以"Success"响应 .
当我所做的一切都需要 aws-sdk
模块时,为什么我的技能会中断?
我是AWS的新手,这是我第一次尝试在Lambda函数中访问DynamoDB表 .
Lambda函数作为zip包上传,其中包含我的源代码package.json(包括 aws-sdk
作为依赖项)和 node_modules
文件夹 .
2 回答
经过数小时的调试,我发现将
import * as AWS from 'aws-sdk';
更改为import {DynamoDB} from 'aws-sdk';
(或{CloudFront}
或您实际使用的任何内容)会导致超时问题消失 . 请注意,实际连接到DynamoDB的时间对我来说从来都不是问题,它始终是超时发生的import
行 .Lambda在使用NodeJS时使用回调延续模型 . 您的模块应该导出一个带有三个参数的函数:事件,上下文和回调 .
Event
提供输入参数 .另外两个用于从处理程序函数返回控制,具体取决于您使用的NodeJS版本 .
尝试添加我提到的三个参数,并在导出的处理函数中调用:
请记住,我在移动设备上写下了这个问题,所以你可能需要对代码进行小的调整,但想法是一样的 . 不要直接从函数返回,而是调用回调以提供响应作为延续 . 请注意,在早期版本的NodeJS中,在版本4之前,您必须使用上下文来设置成功或失败,而不是调用回调 .
有关更多详细信息,请参阅AWS上的Lambda with NodeJS技术文档 .
另外要记住的是,对Alexa而言,响应应采用正确的格式 . 这是一个JSON响应,包含所有必要的元素,如Alexa Skills Kit tech docs中所述 .
您包含的Alexa ASK sdk会生成这些响应,但我认为我应该指向实际的文档,以防您尝试手动构建响应以了解其工作原理 .