2015-08-31 121 views
0

以下內容將讀取並導入很多CSV文件從磁盤到MongoDB,但如果沒有通過resizePhoto()函數導入所有文件後,NodeJS將不會退出(其中包含調整圖像大小後的一個process.exit)。如何從node.js正確退出

如何在不中斷導入所有文件後正常關閉它?如果我添加一個process.exit .on,它將在導入第一個文件後退出。

var importData = function(fileName) { 

    // Get file from disk. 
    var filePath = path.join(folder, fileName); 

    // Read and import the CSV file. 
    csv.fromPath(filePath, { 
     objectMode: true, 
     headers: keys 
    }) 
    .on('data', function (data) { 

     var Obj = new models[fileName](data); 

     models[fileName].find({}).remove().exec(); 

     Obj.save(function (err, importedObj) { 
      if (err) { 
       console.log(fileName, err); 
      } else if (fileName === 'PHOTOS') { 
       resizePhoto(importedObj); 
      } 
     }); 

    }) 
    .on('end', function() { 
     console.log(fileName + ': Imported.'); 
    }); 
}; 

module.exports = importData; 
+0

csv變量來自哪裏? – aaaidan

+0

調用這個的代碼在哪裏?看起來你應該向'importData()'添加一個回調,並在導入完成時調用該回調,然後調用者可以在該回調中執行'process.exit()'。 – jfriend00

+0

@aaaidan來自fast-csv – Gab

回答

0

使用模塊異步,方法平行https://github.com/caolan/async#parallel)。它可以並行調用您的任務(導入),並在所有任務結束後調用最終處理程序(退出)。

你的情況:
1)某處在項目

csvImp=require('importData.js'); 
async.parallel([ 
    function(done){csvImp(name1,done);}, 
    function(done){csvImp(name2,done);}, 
    ... 
    function(done){csvImp(nameN,done);} 
], 
function(err, results){ 
    process.exit(); 
}); 

2)importData.js

var importData = function(fileName,done) { 
... 
.on('end', function() { 
    console.log(fileName + ': Imported.'); 
    done(); 
}); 

所以,下次你需要準備的任務列表。像

names.forEach(function(n){ 
    tasks.push(function(done){csvImp(n,done);}); 
}); 

有什麼東西叫async.parallel任務

祝你好運)