我想阻止我的NodeJS应用程序崩溃,并且读取使用域是这样做的方法。我仍然有点困惑,但遵循我所看到的设置。这个设置正确吗?我需要改变什么吗?感谢。
var express = require('express');
var http = require('http');
var path = require('path');
var d = require('domain').create();
var app = express();
app.configure(function() {
//set up express
app.set('port', process.env.PORT || 3000);
app.use(app.router);
app.use(function(req,res){
res.redirect('/error');
});
});
//launch
d.on('error', function(er) {
console.log('Error!', er.message);
});
d.run(function() {
http.createServer(app).listen(app.get('port'), function(){
console.log('Express server listening on port ' + app.get('port'));
});
});
当我在其中一个路由文件中创建错误时,它似乎正常工作,但错误不是记录。我是否应该将其记录到文件或其他内容以便稍后检查错误?
答案 0 :(得分:1)
根据NodeJS文档,您正在做的是一种不好的做法,因为每次发生错误时都可以启动内存泄漏。有domain api docs page正确方法的例子。我不确定为什么console.log不起作用,但是 - 日志文件可能是个好主意。另请注意,域的api仍然不稳定,可能会发生变化。
简而言之,您应该优雅地处理错误,并在发生意外错误时启动新的工作进程(使用群集模块启动和停止遇到问题的工作人员)。
从文档来看,这就是你不应该做的事情,这看起来非常接近你正在做的事情:
// XXX WARNING! BAD IDEA!
var d = require('domain').create();
d.on('error', function(er) {
// The error won't crash the process, but what it does is worse!
// Though we've prevented abrupt process restarting, we are leaking
// resources like crazy if this ever happens.
// This is no better than process.on('uncaughtException')!
console.log('error, but oh well', er.message);
});
d.run(function() {
require('http').createServer(function(req, res) {
handleRequest(req, res);
}).listen(PORT);
});