0

Express 4と手ごわいを使用して、nano経由でcouchdbに複数の画像を挿入しようとしています。formidable と nano を使用して個々のファイルに問題なくアクセスして挿入できますが、ファイルを次々と挿入しようとすると、競合エラーが発生します。私はjsとノードに非常に慣れていないため、コールバックと非同期関数の理解が限られていることを知っています. これは私が現時点で持っているものです。どんな助けでも大歓迎です。

function uploadImage(req, res) {

var form = new formidable.IncomingForm(),
files = [],
fields = [];
uploadcount = 1;

form.on('field', function(field, value) {
  fields.push([field, value]);
})

form.on('file', function(field, file) {
  files.push([field, file]);
  var docid = fields[0][1];
  getrevision();

  function getRevision(){
    dbn.get(docid, { revs_info: true }, function(err,body, file){
      if (!err) {
        exrev = body._rev;
        insertImage(exrev);
      }else{ 
        console.log(err);
      }
    });  
  }

  function insertImage(exrevision){
    var exrev = exrevision;
    fs.readFile(file.path, function (err, data) {
      if (err){
        console.log(err);}else{              
          var imagename = docid + "_" + uploadcount + ".png";
          dbn.attachment.insert(docid,imagename,data,'image/png',
          { rev: exrev }, function(err,body){
            if (!err) {
              uploadcount++;
            }else{ 
              console.log(err);
            }
          });
        };        
    });
  };
});

form.on('end', function() {
  console.log('done');
  res.redirect('/public/customise.html');
});

form.parse(req);

};

4

2 に答える 2

0

これは、非同期呼び出しの処理に関する問題です。各添付ファイルの挿入にはドキュメントの現在のリビジョン番号が必要なため、挿入を並行して行うことはできません。前の添付ファイルからの応答を取得した後でのみ、新しい添付ファイルを挿入する必要があります。

これを行うには、promise および deferred メカニズムを使用できます。しかし、私は個人的に「async」と呼ばれるパッケージを使用して同様の問題を解決しました。非同期では、async.eachSeries() を使用してこれらの非同期呼び出しを連続して行うことができます。

もう 1 つのポイントは、リビジョン番号に関するものです。db.get() の代わりに、より軽量な db.head() 関数を使用できます。リビジョン番号は「etag」ヘッダーの下に表示されます。次のように rev を取得できます。

// get Rev number
db.head(bookId, function(err, _, headers) {
    if (!err) {
        var rev = eval(headers.etag);

        // do whatever you need to do with the rev number
        ......
    }
});

さらに、添付ファイルを挿入するたびに、couchdb からの応答は次のようになります。

{"ok":true,"id":"b2aba1ed809a4395d850e65c3ff2130c","rev":"4-59d043853f084c18530c2a94b9a2caed"} 

rev プロパティは、次の添付ファイルへの挿入に使用できる新しい rev 番号を提供します。

于 2014-09-07T15:13:20.580 に答える
0

最初にファイルを一時ディレクトリにダンプし、nano を介して単一の関数内でファイルを couchdb に挿入することで解決策を見つけました。ファイルストリームを一時停止してcouchdbの応答を待つ方法が見つからなかったので、この順次的な方法で十分だと思われます。

于 2014-08-08T03:23:45.647 に答える