这是我的代码(它是coffeescript并使用颜色,但这不相关)
if !module.parent
try
hons_server.listen config.port
console.log 'Listening to port ' + config.port
catch err
console.error "Couldn't start server: #{String(err)}".red
Run Code Online (Sandbox Code Playgroud)
hons_server是一个express.js服务器.我很难理解为什么抛出的错误hons_server.listen()不会被try/catch捕获.当我运行我的服务器两次时,我得到输出:
$ coffee src/server.coffee
Listening to port 9090
node.js:201
throw e; // process.nextTick error, or 'error' event on first tick
^
Error: listen EADDRINUSE
at errnoException (net.js:632:11)
at Array.0 (net.js:733:26)
at EventEmitter._tickCallback (node.js:192:40)
我想知道为什么没有捕获抛出的错误,以及我如何/在哪里可以捕获EADDRINUSE错误.
我浏览了Express的文档,描述错误处理的部分对我来说完全不透明.
我认为app他们指的是一个实例createServer(),对吧?但我不知道如何在处理请求期间发生异常时阻止node.js炸毁应用程序进程.
我真的不需要任何花哨的东西; 只要有异常,我只想返回500的状态,加上一个空的响应.节点进程不能仅因为某处存在未捕获的异常而终止.
有一个如何实现这个的简单例子吗?
var express = require('express');
var http = require('http');
var app = express.createServer();
app.get('/', function(req, res){
console.log("debug", "calling")
var options = {
host: 'www.google.com',
port: 80,
path: "/"
};
http.get(options, function(response) {
response.on("data", function(chunk) {
console.log("data: " + chunk);
chunk.call(); // no such method; throws here
});
}).on('error', function(e) {
console.log("error connecting" + e.message);
});
});
app.configure(function(){
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});
app.listen(3000);
Run Code Online (Sandbox Code Playgroud)
崩溃整个应用程序,产生追溯 …
好的,所以我有一个问题.如果在处理HTTP请求时发生未捕获的异常,我就没有机会在http.ServerResponse对象上调用end()方法.因此,服务器永远挂起,永远不会满足请求.
这是一个例子:
var express = require('express');
var app = express.createServer();
var reqNum = 0;
app.get('/favicon.ico', function(req, res) {res.send(404);});
app.get('*', function(req, res, next) {
console.log("Request #", ++reqNum, ":", req.url);
next();
});
app.get('/error', function(req, res, next) {
throw new Error("Problem occurred");
});
app.get('/hang', function(req, res, next) {
console.log("In /hang route");
setTimeout(function() {
console.log("In /hang callback");
if(reqNum >= 3)
throw new Error("Problem occurred");
res.send("It worked!");
}, 2000);
});
process.on('uncaughtException', function(err) {
console.log("Uncaught exception!", err);
});
app.listen(8080);
Run Code Online (Sandbox Code Playgroud)
如果您访问/错误,则会发生异常,但会被捕获.用户收到错误消息 - 没问题.但是,如果我访问/挂起,服务器最终将抛出未捕获的异常并永久挂起.任何后续的/ hang请求都将挂起.
这很糟糕.有关如何解决此问题的任何建议?