如何从 JSON 中获取特定项目
How to get a specific item from JSON
我是 node.js 和 DialogFlow 的新手。我正在使用 DynamoDB 存储数据,并且正在 Google 上创建技能。我正在尝试编写代码来检索 table.
上的特定项目
我已经可以显示 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();
}
从 get()
调用返回数据后,data
对象将 contain an Item
attribute。此属性的值将是包含此记录的 attribute/value 对的另一个对象,如果未找到记录,则为空。
您进行的显示 JSON.stringify(data)
的调试应该显示这个。
假设您知道所有字段都在那里,您可以做类似
的事情
const name = data.Item.name;
使用当前 JavaScript 的一种更稳健的方法是确保所有内容都已分配,否则 return undefined
在任何时候。所以像这样的东西会起作用
const name = data && data.Item && data.Item.name;
但是 - 使用 Dialogflow 执行此操作时会遇到问题
您没有显示您使用的是哪个 Dialogflow 库,但其中大多数要求您 return 一个 Promise 以表明它需要等待异步调用(例如对 DynamoDB 的调用)去完成。您正在使用 get()
和回调函数而不是 Promise。因此您需要执行以下操作之一:
将调用包装在 Promise 中
因为 get()
return 是一个 AWS.Request 你可以使用这个的 promise()
方法来获得一个你可以 return 并且有 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" );
});
我是 node.js 和 DialogFlow 的新手。我正在使用 DynamoDB 存储数据,并且正在 Google 上创建技能。我正在尝试编写代码来检索 table.
上的特定项目我已经可以显示 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();
}
从 get()
调用返回数据后,data
对象将 contain an Item
attribute。此属性的值将是包含此记录的 attribute/value 对的另一个对象,如果未找到记录,则为空。
您进行的显示 JSON.stringify(data)
的调试应该显示这个。
假设您知道所有字段都在那里,您可以做类似
的事情const name = data.Item.name;
使用当前 JavaScript 的一种更稳健的方法是确保所有内容都已分配,否则 return undefined
在任何时候。所以像这样的东西会起作用
const name = data && data.Item && data.Item.name;
但是 - 使用 Dialogflow 执行此操作时会遇到问题
您没有显示您使用的是哪个 Dialogflow 库,但其中大多数要求您 return 一个 Promise 以表明它需要等待异步调用(例如对 DynamoDB 的调用)去完成。您正在使用 get()
和回调函数而不是 Promise。因此您需要执行以下操作之一:
将调用包装在 Promise 中
因为
get()
return 是一个 AWS.Request 你可以使用这个的promise()
方法来获得一个你可以 return 并且有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" );
});