Как получить указанный c предмет из JSON - PullRequest
1 голос
/ 25 января 2020

Я новичок в node.js и DialogFlow. Я использую DynamoDB для хранения данных и создаю навыки в Google. Я пытаюсь написать код для получения определенного c элемента в этой таблице.

У меня работает, чтобы показать все элементы, где ID равен = 1, но как бы я сделал так Я могу просто получить атрибут 'name'?

Моя идея состоит в том, что пользователь предоставляет идентификатор, тогда код будет извлекать имя, где 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();
  }

1 Ответ

0 голосов
/ 26 января 2020

Как только вы вернете данные из вызова get(), объект data будет содержать атрибут Item . Значением этого атрибута будет другой объект, который содержит пары атрибут / значение для этой записи, или он будет пустым, если запись не найдена.

Отладка, имеющаяся на вашем месте и показывающая JSON.stringify(data), должна показать this.

Предполагая, что вы знали, что все поля были там, вы могли бы сделать что-то вроде

const name = data.Item.name;

, более надежный способ с использованием current JavaScript состоял бы в том, чтобы убедиться, что все было назначено, иначе вернуть undefined в любой момент. Таким образом, что-то вроде этого будет работать

const name = data && data.Item && data.Item.name;

Однако - у вас возникнут проблемы с этим с Dialogflow

Вы не показываете, какую библиотеку Dialogflow вы используете , но большинство из них требуют, чтобы вы вернули Promise, чтобы указать, что ему нужно ждать завершения асинхронных вызовов (таких как вызов DynamoDB). Вы используете get() с функцией обратного вызова вместо Promise. Поэтому вам необходимо выполнить одно из следующих действий:

  1. Завершение вызова в Обещании

  2. Поскольку 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" );
      });
...