安全读取然后在node.js上异步写入文件?

时间:2015-10-01 18:55:19

标签: node.js file concurrency

我有一个读取和写入日志文件的方法,所有用户在每次请求时调用此方法,然后在文件中写入请求路径的日志。问题是两个:

  1. 是否安全读取,然后考虑并发问题以异步模式写入文件?
  2. 如果是第一个问题,那么下面的代码将考虑并发问题吗?
  3. 如果第一个问题是,我该怎么做?
  4. 请忽略例外和性能问题,这是一个教学代码。


    var logFile = '/tmp/logs/log.js';
    app.get("/", function(req){
        var log = {path: req.path, date: new Date().getTime()};
        log(log);
    });
    
    function log(data){
        fs.exists(logFile, function(exists){
            if(exists){
                fs.readFile(logFile, function (err, data) {
                    if (err){
                        throw err
                    }
                 var logData = JSON.parse(data.toString());
                 logData.push(data);
                 writeLog(logData);
                }); 
            }else{
                writeLog([data]);
            }
    
        });
    
    }
    function writeLog(base){
        fs.writeFile(logFile, JSON.stringify(base, null, '\t'), function(err) {
            if(err)
                throw err;
        }); 
    }
    

    非常感谢!!。

2 个答案:

答案 0 :(得分:2)

我强烈建议您不要异步登录"因为您希望根据应用程序中发生的顺序对日志进行排序,并且如果您不以某种方式同步它,则无法保证会发生这种情况。

例如,您可以使用承诺链来同步它:

log

您现在可以调用{{1}},它会将消息排队并为您异步写入一些时间。它永远不会超过单个文件描述符或耗尽服务器。

考虑使用日志解决方案而不是滚动自己的记录器btw。

答案 1 :(得分:0)

在您的示例中,您已经在使用这些功能的异步版本。如果您关注操作的顺序,那么您应该使用这些功能的同步版本。

readFileSync
writeFileSync

另外需要注意的是,JSON.parse()是一个同步操作。你可以使这个"异步"使用async模块并执行async.asyncify(JSON.parse(data.toString()));

正如@BenjaminGruenbaum所指出的那样,async.asyncify();实际上并没有使JSON.parse();的操作真正异步,但它确实提供了更多的" async"控制流程的风格。

相关问题