5

Я использую nodeJS SDk положить товар в dynamoDB, Деталь:Как вернуть добавленный элемент в dynamoDB

{ 
    "eventId": date + '-' + eventName + '-' + eventPurpose, 
    "eventName": eventName, 
    "eventPurpose": eventPurpose, 
    "eventDates": eventDates, 
    "attendees": attendees 
} 

Настоящий код положить пункта в dynamoDB:

const params = { 
    TableName: "event", 
    Item: { 
     "eventId": date + '-' + eventName + '-' + eventPurpose, 
     "eventName": eventName, 
     "eventPurpose": eventPurpose, 
     "eventDates": eventDates, 
     "attendees": attendees 
    }, 
    ReturnValues: "ALL_OLD" 
    }; 

    dynamo.put(params, (err, data) => { 
    console.log("coming here"); 
    if (err) { 
     console.log("error : " + JSON.stringify(err)); 
    } 
    console.log("data" + JSON.stringify(data)); 
    cb(null, data); 
    }); 

Вставка происходит правильно, а возвращаемое значение - пустой объект.

Я хотел бы вернуть вставленный элемент. Я нашел это doc. Но это возвращается только в случае обновления старого значения. Я не мог найти другую полезную информацию, кроме этого.

Есть ли какая-либо работа вокруг или нам просто нужен запрос с использованием метода get с первичным ключом?

+0

Обратите внимание на обратный вызов, если вы получили 'err', вы определенно не должны называть лямбда' callback', как если бы он был успешным. Регулярный блок 'if/else' поможет удалить путаницу в будущем! –

ответ

5

Ссылка Размещенное Вами, к сожалению, единственный реальный ответ на это время (API версии 2012-08-10). PutItem может возвращать элементы непосредственно перед их обновлением или вообще ничего.

Параметр ReturnValues используется несколькими операциями DynamoDB; однако PutItem не признает никаких значений, кроме NONE или ALL_OLD.

Короче говоря, единственный надежного способом восстановить свой вставленный объект является GetItem, так же, как вы догадались.

2

Обратите внимание, что это деталь вы вставляете, которые у вас уже есть доступ к:

{ 
    "eventId": date + '-' + eventName + '-' + eventPurpose, 
    "eventName": eventName, 
    "eventPurpose": eventPurpose, 
    "eventDates": eventDates, 
    "attendees": attendees 
} 

Вы можете просто изменить свой код к этому, и тогда вы бы вставленный элемент в переменной item уже:

var item = { 
     "eventId": date + '-' + eventName + '-' + eventPurpose, 
     "eventName": eventName, 
     "eventPurpose": eventPurpose, 
     "eventDates": eventDates, 
     "attendees": attendees 
    }; 

const params = { 
    TableName: "event", 
    Item: item, 
    ReturnValues: "ALL_OLD" 
    }; 

вы, кажется, следует путать о том, что вы вставляете, потому что вы начинаете свой вопрос, показывая объект вы говорите, вы вставляете, но код вы вывесили вставляет немного другой объект ,

+0

ya вы правы. Первый фрагмент кода содержит тело запроса. Так или иначе, я смутился и сделал объектив. Исходя из этого, ваше решение является хорошим, но обычно в mongoDB оно возвращает вставленный объект, и я думал, что в dynamoDB может быть что-то подобное. ** ReturnValues: «ALL_NEW» ** разрешен только в операциях обновления. Только для ** put ** ** ** NONE ** или ** ALL_OLD **. Спасибо за быстрый ответ. Я буду следовать, как вы сказали. Простой и элегантный подход. Спасибо, знак! –

5

Просто пройти params.Item в функции обратного вызова:

dynamo.put(params, (err, data) => { 
     if (err) { 
      cb(err); 
     } 
     cb(null, params.Item); 
     }); 

Пропустите err в обратный вызов тоже;)

+0

Где вы были в моей жизни – booky99

+0

разве это не обман? ... Я имею в виду, что мне нужны реальные данные, которые были вставлены в db, верно? – MeBNoah

+0

Вид. Это зависит от того, что вы хотите вернуть: объект, который вы хотите сохранить в базе данных или фактическом сохраненном объекте. – Sigma

 Смежные вопросы

  • Нет связанных вопросов^_^