OK、問題があります。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);
/ errorにアクセスすると、例外が発生しますが、キャッチされます。ユーザーはエラーメッセージを受け取ります-問題ありません。ただし、/ hangにアクセスすると、サーバーは最終的にキャッチされない例外をスローし、永久にハングします。/hangに対する後続の要求はすべてハングします。
これは最悪だ。この問題を解決する方法について何かアドバイスはありますか?