2013-03-28 20 views
18

私はエラー処理をexpressで実行しようとしていますが、 "error !!!"という応答は表示されません。私はコンソールに「何らかの例外」があり、プロセスが強制終了されることを期待しています。これはエラーハンドリングがどのようにセットアップされているのでしょうか?それでエラーを捕まえる別の方法があるのでしょうか?あなたのコードが働いていなかったExpress jsエラー処理

1):

// 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"); 
}); 

答えて

23

エラー処理の例アプリ/ガイドは https://expressjs.com/en/guide/error-handling.html で提供されています。しかし、あなたのコードを修正する必要がありますルートに達する前にエラーハンドラミドルウェアが実行されたため、エラーハンドラにエラーが渡されることはありませんでした。このスタイルは継続継承と呼ばれます。ミドルウェアスタックの最後にエラーハンドラを配置します。

2)未処理のエラーが発生した場合は、サーバーをシャットダウンする必要があります。

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);

をやった結果がある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

+8

将来的には、3.x => 4.xの移行プロセスでは、app.routerは廃止予定です。 https://github.com/strongloop/express/wiki/Migrating-from-3.x-to-4.xを参照してください。 –

7

いくつかのヒント:

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"); 
}); 
+1

「サーバーをシャットダウンする必要がありますか?」どうして?いいえ!貴方はするべきではない! – fiatjaf

+0

未処理のエラーが発生した場合は、エラーによりアプリケーションが未定義状態になる可能性があるため、サーバーをシャットダウンする必要があります。つまり、状況が間違っている可能性があります。シャットダウンすると、アプリは安定した状態に再開することで自分自身を修復するチャンスを与えます。 –

+0

誰かが未処理の例外をトリガーした場合、アプリ全体は誰のためにもダウンしますか?愚かな – astroanu

2

私は同じ問題を抱えていたし、間違っていたかを把握できませんでした。 明白なerrorHandlerが定義されていれば、カスタムエラーハンドラは決して呼び出されません。あなたは、次のコードを持っているだけで、それを削除した場合 は:

var express = require("express"), 
    connectDomain = require("connect-domain"), 
    app = express(), 
    errorHandler; 

//私たち:急行インストール

私のために働いた
if ('development' == app.get('env')) { 
    app.use(express.errorHandler()); 
} 

:)

+0

私は3 '='を使用することをお勧めしますので、良いhabbitのためだけにチェックしてください:) –

1

を接続するドメインを、そしてこのような何かをインストールエラーハンドラ

app.use(connectDomain()); 
    errorHandler = function (err, req, res, next) { 
     res.send(500, { 
      "status": "error", 
      "message": err.message 
     }); 
    console.log(err); 
}; 

次に、エンドポイントを設定するときに、tack errorHan最後に利用者():

app.get("/some/data", function (req, res) { 
    // ... do some stuff ... 
    res.send(200, "Yay! Happy Success!"); 
}).use(errorHandler);