我是node.js和DialogFlow的新手。我使用DynamoDB存储数据,并在谷歌上创建技能。我正在试图编写一个代码来检索该表上的特定项。
我让它显示ID等于= 1的所有项,但是我如何使它能够得到属性'name‘呢?
我的想法是,用户提供一个id,然后代码将检索id原来为1的名称,并将其存储为变量,并使用agent.add('hello $(name)');将其作为语音显示给用户。
function readdata(agent){
let dbread = new aws.DynamoDB.DocumentClient();
const id = agent.parameters.id;
let read = function(){
var parameters = {
TableName:"Dynamodb",
Key:{
"id":id
}
};
dbread.get(parameters, function(err,data){
if(err){
console.log("error",JSON.stringify(data,null,2));
}else{
console.log("success",JSON.stringify(data,null,2));
}
});
agent.add(`hello ${name}`);
};
read();
}发布于 2020-01-26 13:36:52
一旦您从get()调用中获得数据,data对象将属性。此属性的值将是另一个包含此记录的属性/值对的对象,如果找不到该记录,则为空。
显示JSON.stringify(data)的调试应该显示这一点。
假设你知道所有的田地都在那里,你可以做如下的事情
const name = data.Item.name;使用当前JavaScript的一种更健壮的方法是确保分配了所有内容,否则在任何时候都返回undefined。所以像这样的东西会起作用
const name = data && data.Item && data.Item.name;然而,-您在使用对话框流时会遇到问题
您没有显示您使用的是哪个对话框流库,但它们中的大多数都要求您返回一个承诺,指示它需要等待异步调用(例如对DynamoDB的调用)才能完成。您使用的是带有回调函数的get(),而不是承诺函数。因此,您需要执行以下操作之一:
get()返回一个AWS.Request,所以您可以使用这个方法的promise()方法得到一个承诺,您可以返回它,其中包含生成响应的then部分--类似于您现在进行回调的方式。在此方案下,您的调用可能如下所示(未经测试):
return dbread.get(parameters).promise()
.then( data => {
console.log("success",JSON.stringify(data,null,2));
const name = data && data.Item && data.Item.name;
if( name ){
agent.add( `Hello ${name}` );
} else {
agent.add( "I don't know who you are." );
}
})
.catch( err => {
console.log("error",JSON.stringify(data,null,2));
agent.add( "There was an error" );
});https://stackoverflow.com/questions/59910068
复制相似问题