处理409冲突文件nodejs nano couchdb

时间:2014-08-25 04:36:58

标签: javascript node.js couchdb conflict couchdb-nano

我一直在研究这个问题,因为couchdb提供了太多document conflicts

我已经看到了解决方案Updating a CouchDB document in nano这样说:

  1. 获取文件
  2. 保存_rev
  3. 应用更改
  4. 尝试使用已保存的_rev
  5. 发送更新的文档
  6. 如果是409
  7. ,请转到步骤1

    我已经尝试制作一个功能,直到最后一步:

    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。转到409' 的第1步,这是否意味着我必须进行调用同一函数的递归?如果文档继续发生冲突,它肯定会成为一个无限循环,我的服务器将再次崩溃。目前,我所做的是每5秒钟不允许超过1个请求,但这在将来不会很好。

    如何在nodejs中使用nano正确处理409个冲突的CouchDB文档?

1 个答案:

答案 0 :(得分:1)

您获得409的原因是因为_rev已过时,因为每个文档更新都会更改它。所以不要坚持_rev

如果您需要更新多个文档,请尝试使用Bulk Document API,或者使用Partial Update,这类似黑客可以在不指定_rev的情况下更新文档(它会自动从数据库中读取_rev