【问题标题】:How to exit properly from node.js如何从 node.js 中正确退出
【发布时间】:2015-11-24 23:13:00
【问题描述】:

以下将从磁盘读取许多 CSV 文件并将其导入 MongoDB,但如果没有通过 resizePhoto() 函数,NodeJS 在导入所有文件后不会退出(其中包含调整图像大小后的 process.exit )。

如何在导入所有文件后正常关闭而不中断?如果我添加一个 process.exit .on end 它将在导入第一个文件后退出。

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;

【问题讨论】:

  • csv变量从何而来?
  • 调用这个的代码在哪里?看来您应该向importData() 添加一个回调并在导入完成后调用该回调,然后调用者可以在该回调中执行process.exit()
  • 来自 fast-csv 的@aaaidan

标签: javascript node.js mongodb


【解决方案1】:

使用模块async,方法parallel (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);});
});

并使用 tasks 调用 async.parallel

祝你好运)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-04
    • 2012-07-18
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多