1

Я использую пакет Node.js Dynamoose для обработки запросов DynamoDB в своем веб-приложении.Обновление Dynamoose/DynamoDB, сохраняющее пустой массив как null

Проблема в том, что я пытаюсь обновить элемент, когда объект JSON содержит пустой массив. Dynamoose, похоже, устанавливает значение null. Или это может быть DynamoDB для всего, что я знаю.

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

var NoteSchema = new dynamoose.Schema({ 
    _id: String, 
    details: Array 
}); 

В коде ниже переменной body установлен в {details: []}. Я подтвердил это, запустив console.log(body);.

Note.update({ 
    _id: searchid 
}, body, function(err, note) { 
    if (err) { 
     console.log(err); 
    } else { 
     console.log(note); 
    } 
}); 

Проблема заключается в том, что внутри функции обратного вызова при запуске console.log(note);details даже не показывает вообще. Таким образом, он имеет значение null или undefined. В Amazon Web Services снова details не существует вообще для этой записи.

Что странно, когда вы создаете новое примечание, устанавливаете details = [] и сохраняете его, детали являются пустым массивом и отлично работают. Поэтому мне кажется, что проблема связана с обновлением записи и установкой этого свойства на пустой массив, поскольку создание записи и установка этого свойства в пустой массив работают отлично.

Как я могу обновить запись и установить детали в пустой массив?

ответ

2

Понял это. Отправлено this issue в репозиторий GitHub. В основном, следующая строка (lib/Model.jsоколо строка 396) кода проверяет, является ли значение массивом с длиной = 0. Если это так, то он удалит этот ключ JSON перед отправкой его в AWS.

if(val === null || val === undefined || val === '' || (Array.isArray(val) && val.length === 0)) { 

Я представил pull request используя мой fork. В этом запросе на растяжение я сделал изменение, чтобы разрешитьнеобязательный параметр объекта JSON опций, который должен быть передан в функцию обновления. Это третий параметр функции обновления и прямо перед функцией обратного вызова. Если есть ключ с именем emptyarrayallowed, и это значение установлено на true, тогда вы, эта строка выше, будет изменена на следующее.

if(val === null || val === undefined || val === '') { 

Например, в моем примере выше изменения функции обновления к следующему будет работать (до тех пор, как вы используете вилку или запрос втягивания был утвержден).

Note.update({_id: searchid}, body, {"emptyarrayallowed": true}, function(err, note) { 
    if (err) { 
     console.log(err); 
    } else { 
     console.log(note); 
    } 
}); 

Сообщите мне, если у вас есть вопросы относительно этого решения.