javascript - Alexa 自定义技能 DynamoDB.Node.js ResponseBuilder 不等待异步调用完成
问题描述
我是 Node.js 和 Javascript 的新手,我正在使用 Lambda 函数和 DynamoDB 开发一个 Alexa 应用程序。
我在 DynamoDB 中有一个名为:Chat with PrimaryKey: 'Said' 和一列 'say' 的表。每当启动 Alexa 技能时,我只想根据用户所说的内容获取记录并返回。所以它基本上是一个关于主键的查询,它工作正常。
但是,我没有从语音输出变量中的 lambda 函数得到任何响应,因为 API 不会等待响应生成器完成对 DynamoDB 的异步调用并返回空响应。
有没有办法在发送响应之前强制解决异步调用?
const WelcomeMessage = {
canHandle(handlerInput) {
const request = handlerInput.requestEnvelope.request;
return request.type === 'LaunchRequest' ||
(request.type === 'IntentRequest');
},
handle(handlerInput) {
var ans;
var AWS = require('aws-sdk');
// Set the region
AWS.config.update({
region: 'us-east-1'
});
// Create the DynamoDB service object
var dynamodb = new AWS.DynamoDB();
var params = {
TableName: 'chat',
Key: {
'said': {
S: 'Hi Sir' + ''
}
},
ProjectionExpression: 'say'
};
dynamodb.getItem(params, function(err, data) {
if (err) {
console.log(err, err.stack);
} else {
if (data) {
return handlerInput.responseBuilder
.speak(data.Item.say.S + '')
.getResponse();
} else {
ans = 'You dint train me for that!';
return handlerInput.responseBuilder
.speak(ans)
.getResponse();
}
}
});
}
};
错误的输出:
解决方案
我找到了解决方法。我返回一个承诺并在返回它之前解决它,以确保在发送响应之前完成回调。
const WelcomeMessage = {
canHandle(handlerInput) {
const request = handlerInput.requestEnvelope.request;
return request.type === 'LaunchRequest'
|| (request.type === 'IntentRequest');
},
handle(handlerInput) {
return new Promise((resolve) => {
var ans;
var AWS = require('aws-sdk');
// Set the region
AWS.config.update({region: 'us-east-1'});
// Create the DynamoDB service object
//ddb = new AWS.DynamoDB({apiVersion: '2012-10-08'});
var dynamodb = new AWS.DynamoDB();
var params = {
TableName : 'chat',
Key: {
'said':{S: handlerInput.requestEnvelope.request.intent.slots.input.value+''}
}
};
dynamodb.getItem(params, function(err, data) {
if (err){
console.log(err, err.stack);
}
else{
if(data.Item){
return resolve(handlerInput.responseBuilder
.speak(data.Item.say.S+'')
.withShouldEndSession(false)
.getResponse());
}
else{
ans='You dint train me for that!';
return resolve(handlerInput.responseBuilder
.speak(ans)
.withShouldEndSession(false)
.getResponse());
}
}
});
});
}
};
推荐阅读
- javascript - Knockout JS:函数调用两次
- bash - 在同一行的特定单词之后提取一个单词,但它们之间没有空格
- json - 无法从 spark 作业中写入 redis
- html - 内容渲染期间 Vue.js 的浮点不准确性
- java - 为什么调用方法不需要导入类?
- css - 多个类属性(来自变量)未在反应中显示
- excel - 将两种不同类型的图表添加到 Excel 并设置它们的格式
- azure - 如何在 Azure Logic App 发送电子邮件 Office 365 连接器中嵌入图像?
- linux - 即时客户端有什么问题?| cx_Oracle.Database: ORA-12514
- xamarin.forms - 对动态字段使用 FFImageloading RoundedTranformation。