如何从 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。因此您需要执行以下操作之一:

  1. 将调用包装在 Promise 中

  2. 因为 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" );
      });