Обработать конфликтный документ 409 nodejs nano couchdb
Я провел некоторое исследование по этому вопросу, что couchdb дает слишком много конфликтов документов.
Я видел решение Обновление документа CouchDB в nano, говорящее это:
- Получить документ
- Сохранить _rev
- Применять изменения
- Попробуйте отправить обновленный документ с сохраненным _rev
- Переходите к шагу 1 в случае 409
И я пытался создать функцию, которая делает это, до последнего шага:
nano_update = function ( data, id, callback ) {
var db = this;
db.get( id, function( err, doc ) { //Get _rev of the document
if ( !err ) {
for ( var k in data ) {
//Replace defined information while keeping the other
if ( k.toLowerCase() !== '_rev' ) //Do not override _rev
doc[ k ] = data[ k ];
}
return db.insert( doc, id, callback ); //Insert with _rev to update
}
});
}
//Call it
var database = nano.use( 'databaseName' );
nano_update.call( database, { counter: Math.random() }, 'documentName' );
Это близко к тому, что я ожидаю, однако, если я буду открывать 2 окна, выполняя один и тот же запрос непрерывно, это достигнет точки, в которой конфликтуют 2 документа, приводящие к краху моего сервера.
Итак, говоря "5. Переходите к шагу 1 в случае 409 ', значит ли это, что мне нужно выполнить рекурсию вызова той же функции? Если документы будут продолжать конфликтовать, это наверняка будет бесконечный цикл, и мой сервер просто снова выйдет из строя. В настоящее время я НЕ разрешаю более 1 запроса в 5 секунд, но это не поможет в будущем.
Как правильно обработать 409 конфликтующих документов CouchDB, используя nano в nodejs?
1 ответ
Причина, по которой вы получаете 409, состоит в том, что _rev
устарел, так как каждое обновление документа меняет его. Так что не держись за _rev
,
Если вам нужно обновить несколько документов, попробуйте использовать API Bulk Document, или вы можете использовать Partial Update, что является своего рода хаком для обновления документа без указания _rev
(он автоматически читает _rev
из БД).