Javascript Node.js-在前面的代码完成后,等待process.exit()执行
在我的node.js应用程序中,我希望在服务器关闭时,即在cmd中完成CTRL+C操作时,将一些数据写入日志文件。问题是在文件写入完成之前调用process.exit。我尝试使用回调和jQuery$.Deferred.resolve,但没有效果:可能是因为文件写入是异步的,但我希望保持异步。 回调代码:Javascript Node.js-在前面的代码完成后,等待process.exit()执行,javascript,node.js,asynchronous,callback,fs,Javascript,Node.js,Asynchronous,Callback,Fs,在我的node.js应用程序中,我希望在服务器关闭时,即在cmd中完成CTRL+C操作时,将一些数据写入日志文件。问题是在文件写入完成之前调用process.exit。我尝试使用回调和jQuery$.Deferred.resolve,但没有效果:可能是因为文件写入是异步的,但我希望保持异步。 回调代码: if (process.platform === "win32"){ var rl = readLine.createInterface ({ input: proces
if (process.platform === "win32"){
var rl = readLine.createInterface ({
input: process.stdin,
output: process.stdout
});
rl.on ("SIGINT", function (){
process.emit ("SIGINT");
});
}
process.on ("SIGINT", function(){
var stopServer = function() {
//this happens way too early, the logger.log has not written it's data yet
process.exit();
};
var logServerStop = function(callback) {
logger.log("SERVER SHUTDOWN: ", true);
logger.log("-----------------------------------------");
logger.log("");
callback();
};
logServerStop(stopServer);
});
以及logger.log代码:
我还希望保持log函数的原样,这样就不必添加回调函数参数,我希望在回调代码中处理我的问题。提前谢谢
编辑1
以及logger.log的更改:
请查看对日志函数的编辑
exports.log = function(data, addDate, callback){
if (typeof addDate === 'undefined') { myVariable = false; }
var now = new Date();
var date = now.getDate() + "-" + (now.getMonth() + 1) + "-" + now.getFullYear();
var time = now.getHours() + now.getMinutes();
if(addDate){
data = data + date + " " + now.toLocaleTimeString();
}
var buffer = new Buffer(data + '\r\n');
fs.open(filename, 'a', function( e, id ) {
if(e){
console.log("Foutje: " + e);
//execute call back here.
if(typeof callback === 'function'){
callback(e);
}
}
else{
fs.write( id, buffer, 0, buffer.length, null, function(err){
if(err) {
console.log(err);
} else {
console.log("De log file is aangevuld.");
}
//execute call back here.
if(typeof callback === 'function'){
callback(err);
}
});
}
});
};
在callback中,您可以将错误作为第一个参数传递,然后在调用logger.log时,您可以按如下方式执行此操作:
process.on ("SIGINT", function(){
logger.log("SERVER SHUTDOWN: ", true);
logger.log("-----------------------------------------");
logger.log("", false, function(e){
if(e){
//Handle error here.
}
process.exit();
});
});
恐怕你的建议没有解决这个问题,请按照编辑。如果您正在编辑日志函数,您可以在编写日志文件后调用回调函数。感谢您的努力,但上述响应已经帮助我实现了同样的想法!:另外,在您的建议中,我并不希望err作为回调的参数。谢谢你!为什么要避免对日志方法使用回调函数?这是最简单的解决办法。这并不意味着您必须每次都使用它。我尝试向log方法添加回调参数,但由于某些原因,回调永远不会被调用。记录器按预期将数据写入日志文件,但process.exit从未发生。我尝试在日志方法的末尾添加一行iftypeoffn=='function'{fn;},这修复了进程的问题。退出没有发生,但文件写入没有再次发生。请显示该尝试,好吗?你到底在哪里添加了fn调用,你是如何修改你的sigint处理程序的?我用你要求查看的更改编辑了我的帖子。当然,你需要将它放在异步打开/写入回调中,否则它就等同于你以前所做的!
exports.log = function(data, addDate, callback){
if (typeof addDate === 'undefined') { myVariable = false; }
var now = new Date();
var date = now.getDate() + "-" + (now.getMonth() + 1) + "-" + now.getFullYear();
var time = now.getHours() + now.getMinutes();
if(addDate){
data = data + date + " " + now.toLocaleTimeString();
}
var buffer = new Buffer(data + '\r\n');
fs.open(filename, 'a', function( e, id ) {
if(e){
console.log("Foutje: " + e);
}
else{
fs.write( id, buffer, 0, buffer.length, null, function(err){
if(err) {
console.log(err);
} else {
console.log("De log file is aangevuld.");
}
});
}
});
if(typeof(callback)=='function'){ callback(); }
};
exports.log = function(data, addDate, callback){
if (typeof addDate === 'undefined') { myVariable = false; }
var now = new Date();
var date = now.getDate() + "-" + (now.getMonth() + 1) + "-" + now.getFullYear();
var time = now.getHours() + now.getMinutes();
if(addDate){
data = data + date + " " + now.toLocaleTimeString();
}
var buffer = new Buffer(data + '\r\n');
fs.open(filename, 'a', function( e, id ) {
if(e){
console.log("Foutje: " + e);
//execute call back here.
if(typeof callback === 'function'){
callback(e);
}
}
else{
fs.write( id, buffer, 0, buffer.length, null, function(err){
if(err) {
console.log(err);
} else {
console.log("De log file is aangevuld.");
}
//execute call back here.
if(typeof callback === 'function'){
callback(err);
}
});
}
});
};
process.on ("SIGINT", function(){
logger.log("SERVER SHUTDOWN: ", true);
logger.log("-----------------------------------------");
logger.log("", false, function(e){
if(e){
//Handle error here.
}
process.exit();
});
});