21

Express でエラー処理を実行しようとしていますが、「エラー!!!」の応答が表示されません。コンソールに「何らかの例外」が表示され、プロセスが強制終了されると思います。これは、エラー処理がどのようにセットアップされることになっていますか?もしそうなら、エラーをキャッチする別の方法はありますか?

var express = require('express');
var app = express();

app.use(function(err, req, res, next) {
    console.log("error!!!");
    res.send("error!!!");
});

app.get('/', function(request, response) {
    throw "some exception";
    response.send('Hello World!');
});

app.listen(5000, function() {
  console.log("Listening on 5000");
});
4

5 に答える 5

24

エラー処理に関するアプリ/ガイドの例は、 https://expressjs.com/en/guide/error-handling.htmlで入手できますが 、コードを修正する必要があります。

// Require Dependencies
var express = require('express');
var app = express();

// Middleware
app.use(app.router); // you need this line so the .get etc. routes are run and if an error within, then the error is parsed to the next middleware (your error reporter)
app.use(function(err, req, res, next) {
    if(!err) return next(); // you also need this line
    console.log("error!!!");
    res.send("error!!!");
});

// Routes
app.get('/', function(request, response) {
    throw "some exception";
    response.send('Hello World!');
});

// Listen
app.listen(5000, function() {
  console.log("Listening on 5000");
});
于 2013-03-28T15:38:43.940 に答える
8

いくつかのヒント:

1)ルートに到達する前にエラーハンドラーミドルウェアが実行されたため、コードが機能していなかったため、エラーハンドラーにエラーが渡される機会がありませんでした。このスタイルは継続渡しと呼ばれます。エラー ハンドラーをミドルウェア スタックの最後に配置します。

2) 未処理のエラーが発生した場合は、サーバーをシャットダウンする必要があります。これを行う最善の方法は、サーバーを呼び出すことですserver.close()。ここで、サーバーは実行の結果ですvar server = http.createServer(app);

つまり、次のようにする必要があります。

var server = http.createServer(app);

app.use(function(err, req, res, next) {
  console.log("error!!!");
  res.send("error!!!");
  server.close();
});

完了できない場合に備えて、おそらく server.close() もタイムアウトする必要があります (結局、アプリは未定義の状態にあります)。

var server = http.createServer(app);

app.use(function(err, req, res, next) {
  console.log("error!!!");
  res.send("error!!!");

  server.close();

  setTimeout(function () {
    process.exit(1);
  }, 3*1000);
});

これらすべてを行うライブラリを作成し、特殊なエラー ビュー、提供する静的ファイルなどを含むカスタム レスポンスを定義できるようにしました。

https://github.com/ericelliott/express-error-handler

于 2013-10-17T07:06:25.597 に答える
3

私は同じ問題を抱えていて、何が悪いのかわかりませんでした。問題は、明示的な errorHandler が定義されている場合、カスタム エラー ハンドラーが呼び出されることはありません。次のコードがある場合は、単純に削除してください。

if ('development' === app.get('env')) {
  app.use(express.errorHandler());
}

私のために働いた:)

于 2014-02-18T12:57:52.483 に答える