Как только вы вернете данные из вызова 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. Поэтому вам необходимо выполнить одно из следующих действий:
Завершение вызова в Обещании
Поскольку 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" );
});