node.js - fs.appendFile 成功后退出 Node 进程

标签 node.js fs

我在创建与 Node 并行的进程时遇到了问题,同时在完成简单的 HTTP GET 请求后退出。我注意到,如果我在appendFile 的回调中触发process.exit(),某些文件将不会在 Node 集群设置中创建或附加。理想情况下,下面的方式是我希望如何触发事件,因为工作完成后进程就会退出:

var rp = require("request-promise");
    config = require("./config"),
    cluster = require("cluster"),
    os = require("os"),
    fs = require("fs");

var keywordArray = [
    'keyword1',
    'keyword2',
    ...
];

if (cluster.isMaster) {

    var numCPUs = os.cpus().length;
    var clusterDivision = Math.ceil(keywordArray.length/numCPUs);

    // Reset the json if previously set
    keywordArray.forEach(function(arrayItem) {
        fs.unlink(config.dataDirectory + arrayItem + '.json', function(err) {
            if (err) console.error(err);
            console.log('successfully unlinked ' + arrayItem + '.json from ' + config.dataDirectory);
        });
    });

    // Create a worker for each CPU
    // Seperate the array out evenly for each worker
    for (var j=1;j<=numCPUs;j++) {
        var tempArray = [];
        var removed = keywordArray.splice(0, clusterDivision);
        if (removed.length > 0) {
            // The array contains something so let's do something with the keyword
            console.log('creating a worker');
            cluster.fork().send(removed);
        } else {
            // We don't need a cluster here
        }
    }

    process.on('exit', function() {
        console.log('exited');
    });

} else if (cluster.isWorker) {
    //  Code to run if we're in a worker process

    // Send the object we created above from variables so they're available to the workers
    process.on('message', function(seperatedArrayItem) {

        seperatedArrayItem.forEach(function(arrayItem) {
            function radarRequest(err, response, body) {
                var responseBody = JSON.parse(body);
                console.log(arrayItem); 
                fs.appendFileSync(config.dataDirectory + arrayItem + '.json', JSON.stringify(responseBody.results, null, '\t'), function (err) {
                    if (err) console.err(err);
                    console.log('success writing file');
                });
            }

            rp({
                url: config.radarSearchURI + 
                '?key='+ config.apiKey + 
                '&location=' + config.latitude + ',' + config.longitude + 
                '&radius=' + config.searchRadius + 
                '&keyword=' + arrayItem, headers: config.headers
            }, radarRequest);
        });

        setTimeout(function() {
            process.exit(0);
        }, 5000);
    });
}

我可以确保所有文件都正确附加的唯一方法是使用超时,这正是我不想 - 也不应该 - 做的。有没有其他方法可以确保appendFile 成功发生并然后 终止 Node 进程?这是一种可行的方法(假设该过程不超过 5 秒):

    process.on('message', function(seperatedArrayItem) {

    seperatedArrayItem.forEach(function(arrayItem) {
        function radarRequest(err, response, body) {
            var responseBody = JSON.parse(body);
            console.log(arrayItem); 
            fs.appendFile(config.dataDirectory + arrayItem + '.json', JSON.stringify(responseBody.results, null, '\t'), function (err) {
                if (err) console.err(err)
                console.log('success writing file');
            });
        }

        rp({
            url: config.radarSearchURI + 
            '?key='+ config.apiKey + 
            '&location=' + config.latitude + ',' + config.longitude + 
            '&radius=' + config.searchRadius + 
            '&keyword=' + arrayItem, headers: config.headers
        }, radarRequest);
    });

    setTimeout(function() {
        process.exit(0);
    }, 5000);
});

最佳答案

您可以使用异步流控制模块,例如 async写入所有文件后终止该进程。我还建议使用 cluster.worker.disconnect() 以便 Node 进程能够轻松优雅地退出,但这不是必需的。

async.forEach(seperatedArrayItem, function(item, done){
    // append file and call 'done' when it is written.

}, function(){
    // Will be called when all item 'done' functions have been called.
    cluster.worker.disconnect();
});

关于node.js - fs.appendFile 成功后退出 Node 进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28417508/

相关文章:

node.js - 如何在Nodejs中获取base64编码的视频文件的缩略图?

node.js - 类型错误 : "secret" is required

javascript - 从 fs 目录中动态嵌套结果到对象中

node.js - 用 Jest 模拟 fs 函数

javascript - React 服务器端渲染错误页面

node.js - 我应该如何为嵌套文档建模 MongoDB 集合?

mysql - 雅虎财经查询速度

javascript - 为什么 node.js `fs.existsSync` 在用 promise 包装时不能正常工作?

javascript - Node.js 中的 fs readFile 代码不知何故崩溃了

regex - 使用 fs 在 multer 中重命名上传的图像