问题描述
我正在从dialogflow调用我的dynamodb数据库。以下是意图的代码:
app.intent('Survey ID',(conv) => {
const ans = conv.parameters.any;
let dbread = new aws.DynamoDB.DocumentClient();
let read = function(){
var parameters = {
TableName: "DEV_SURVEY",Key:{
"S_ID": ans
}
};
dbread.get(parameters,function(err,data){
if(err){
console.log("error",JSON.stringify(err,null,2));
conv.close('This is not a valid survey ID');
}
else{
console.log("success",JSON.stringify(data,2));
//conv.add('Hello');
//Adding API here
}
})
}
read();
});
由于在日志中可见内容,因此呼叫数据工作正常。但是响应或在console.log之后编写的任何代码都导致错误。错误是:
解决方法
问题恰恰是错误消息所说的-您正在发出异步请求,但没有返回Promise。由于使用的是回调而不是基于Promise的响应,因此这更加复杂。回调确实完成了,所以您可以看到控制台日志,但是到它完成时,原始函数已经返回并试图发送回复给
dbread.get()
返回一个AWS.Request
object,可以用于获取Promise。将对DynamoDB的调用处理移到Promise处理程序中,并返回Promise,它可能看起来像这样:
app.intent('Survey ID',(conv) => {
const ans = conv.parameters.any;
let dbread = new aws.DynamoDB.DocumentClient();
const parameters = {
TableName: "DEV_SURVEY",Key:{
"S_ID": ans
}
};
return dbread.get(parameters).promise()
.then( data => {
console.log("success",JSON.stringify(data,null,2));
conv.add('Hello');
//API here - make sure they continue to use Promises and .then()
})
.catch( err => {
console.log("error",JSON.stringify(err,2));
conv.close('This is not a valid survey ID');
});
});