私はこの問題についていくつかの調査を行ってきました.couchdbはドキュメントの競合が多すぎます.
私は、nano で CouchDB ドキュメントを更新するという解決策を見てきました。
- ドキュメントを取得
- _rev を保存する
- 変更を適用する
- 保存された _rev で更新されたドキュメントを送信してみてください
- 409 の場合は手順 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ドキュメントを正しく処理するにはどうすればよいですか?