Обработать конфликтный документ 409 nodejs nano couchdb

Я провел некоторое исследование по этому вопросу, что couchdb дает слишком много конфликтов документов.

Я видел решение Обновление документа CouchDB в nano, говорящее это:

  1. Получить документ
  2. Сохранить _rev
  3. Применять изменения
  4. Попробуйте отправить обновленный документ с сохраненным _rev
  5. Переходите к шагу 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 из БД).

Другие вопросы по тегам