2012-12-19 64 views
2

我想使用node.js和nano將附件批量上傳到CouchDB。 首先,步行模塊用於查找上傳文件夾中的所有文件並從中創建數組。 接下來,陣列中的每個文件都應該通過管道和nano模塊插入到CouchDB中。 但是,最終結果是隻有一個附件已經上傳。使用node.js nano模塊將附件批量上傳到couchDB

var nano = require('nano')('http://localhost:5984') 
var alice = nano.use('alice'); 
var fs = require('fs'); 
var walk = require('walk'); 
var files = []; 

// Walker options 
var walker = walk.walk('./uploads', { 
    followLinks: false 
}); 

// find all files and add to array 
walker.on('file', function (root, stat, next) { 
    files.push(root + '/' + stat.name); 
    next(); 
}); 

walker.on('end', function() { 
    // files array ["./uploads/2.jpg","./uploads/3.jpg","./uploads/1.jpg"] 
    files.forEach(function (file) { 
     //extract file name 
     fname = file.split("/")[2] 

     alice.get('rabbit', {revs_info: true}, function (err, body) { 

       fs.createReadStream(file).pipe(

        alice.attachment.insert('rabbit', fname, null, 'image/jpeg', { 
         rev: body._rev 
        }, function (err, body) { 
         if (!err) console.log(body); 
        }) 


       ) 


     }); 



    }); 


}); 

回答

1

這是因爲你正在混合一個異步api和假設它是同步的。

第一次請求後你會得到衝突,導致兔子文件已經改變。

您能使用NANO_ENV=testing node yourapp.js確認它嗎?

我推薦使用異步如果是這樣的問題

+0

這是case.Thank你指出我發現的流量控制教程的problem-,並根據它修改了代碼 - 下面是工作示例 – user1276919

0
var nano = require('nano')('http://localhost:5984') 
var alice = nano.use('alice'); 
var fs = require('fs'); 
var walk = require('walk'); 
var files = []; 

// Walker options 
var walker = walk.walk('./uploads', { 
    followLinks: false 
}); 

walker.on('file', function (root, stat, next) { 
    files.push(root + '/' + stat.name); 
    next(); 
}); 

walker.on('end', function() { 
    series(files.shift()); 

}); 



function async(arg, callback) { 
    setTimeout(function() {callback(arg); }, 100); 
} 


function final() {console.log('Done');} 


function series(item) { 
    if (item) { 
     async(item, function (result) { 
      fname = item.split("/")[2] 

      alice.get('rabbit', { revs_info: true }, function (err, body) { 
       if (!err) { 

        fs.createReadStream(item).pipe(
        alice.attachment.insert('rabbit', fname, null, 'image/jpeg', { 
         rev: body._rev 
        }, function (err, body) { 
         if (!err) console.log(body); 
        }) 


        ) 

       } 
      }); 

      return series(files.shift()); 
     }); 
    } 

    else { 
     return final(); 
    } 
} 
+0

只是好奇,隨着你的「異步」的定義,爲什麼100毫秒的延遲?爲什麼不是0ms,表示異步應該在當前執行堆棧完成後立即啓動?只是想確保我不會錯過節點或js的細微差別。 –