0

我正在尝试使用 express 4 和强大的功能通过 nano 将多个图像插入到 couchdb。我可以使用 formidable 和 nano 毫无困难地访问和插入单个文件,但是,当我尝试一个接一个地插入一个文件时,我会遇到冲突错误。我对 js 和 node 很陌生,我知道我对回调和异步函数的理解是有限的。这就是我目前所拥有的。任何帮助将不胜感激。

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

我找到了一个解决方案,首先将文件转储到一个临时目录中,然后在一个函数中通过 nano 将文件插入到 couchdb 中。我找不到暂停文件流以等待 couchdb 响应的方法,因此这种顺序方法似乎足够了。

于 2014-08-08T03:23:45.647 回答
0

这是处理异步调用的问题。因为每个附件插入都需要文档的当前版本号,所以您不能并行插入。只有在收到前一个附件的回复后,您才必须插入新附件。

你可以使用 promise 和 deferred 机制来做到这一点。但是,我个人使用名为“async”的包解决了类似的问题。在 async 中,您可以使用 async.eachSeries() 串行进行这些异步调用。

另一点是关于修订号,您可以只使用重量更轻的 db.head() 函数,而不是 db.get()。rev 编号显示在“etag”标题下。你可以像这样得到转速:

// 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 回答