我有一个读取和写入日志文件的方法,所有用户在每次请求时调用此方法,然后在文件中写入请求路径的日志。问题是两个:
请忽略例外和性能问题,这是一个教学代码。
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;
});
}
非常感谢!!。
答案 0 :(得分:2)
我强烈建议您不要异步登录"因为您希望根据应用程序中发生的顺序对日志进行排序,并且如果您不以某种方式同步它,则无法保证会发生这种情况。
例如,您可以使用承诺链来同步它:
log
您现在可以调用{{1}},它会将消息排队并为您异步写入一些时间。它永远不会超过单个文件描述符或耗尽服务器。
考虑使用日志解决方案而不是滚动自己的记录器btw。
答案 1 :(得分:0)
在您的示例中,您已经在使用这些功能的异步版本。如果您关注操作的顺序,那么您应该使用这些功能的同步版本。
另外需要注意的是,JSON.parse()是一个同步操作。你可以使这个"异步"使用async
模块并执行async.asyncify(JSON.parse(data.toString()));
。
正如@BenjaminGruenbaum所指出的那样,async.asyncify();
实际上并没有使JSON.parse();
的操作真正异步,但它确实提供了更多的" async"控制流程的风格。