20

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に対する後続の要求はすべてハングします。

これは最悪だ。この問題を解決する方法について何かアドバイスはありますか?

4

3 に答える 3

16

キャッチされない例外が発生すると、クリーンでない状態になります。プロセスを停止して再起動します。安全に正常な状態に戻すためにできることは他にありません。を使用するforeverと、プロセスが終了するとすぐに再起動します。

于 2011-11-13T21:43:45.340 に答える
1

エラーが同期的にスローされた場合、expressは動作を停止せず、500を返すだけです。

this.app.get("/error", (request, response) => {
  throw new Error("shouldn't stop");
});

エラーが非同期でスローされると、expressがクラッシュします。しかし、それの公式ドキュメントによると、それを呼び出すことによってそれから回復する方法がまだありますnext

this.app.get("/error", (request, response, next) => {
  setTimeout(() => {
    try {
      throw new Error("shouldn't stop");
    } catch (err) {
      next(err);
    }
  }, 0);
});

これにより、expressは500エラーで応答する義務を負います。

于 2019-01-22T15:13:42.987 に答える
-1

try / catch/finallyを使用します。

app.get('/hang', function(req, res, next) {
    console.log("In /hang route");
    setTimeout(function() {
        console.log("In /hang callback");
        try {
            if(reqNum >= 3)
                throw new Error("Problem occurred");
        } catch (err) {
            console.log("There was an error", err);
        } finally {
            res.send("It worked!");
        }
    }, 2000);
});
于 2011-11-14T03:07:52.180 に答える