Express (2.5.8) で node.js (0.8.12) のカスタム エラー オブジェクトを使用しています。エラーが発生した場合、エラーをカスタム エラー ハンドラーにルーティングしたいのですが、カスタム エラー オブジェクトは文字列に変換されますが、ネイティブ エラー オブジェクトは同じままです。
以下に簡単な例を示します。
var express = require('express');
var APIError = function(type) {
this.type = type;
}
APIError.prototype = new Error();
var app = express.createServer();
app.use(app.router);
app.use(apiErrorHandler);
function log(source, err) {
console.log(
source,
typeof err,
err.constructor.name,
err instanceof APIError,
err instanceof Error
);
}
function apiErrorHandler(err, req, res, next) {
log("error handler:", err);
}
app.get('/', function(req, res, next) {
var err = new APIError("notAllowed");
log("router:", err);
next(err);
});
app.listen(80);
この例のコンソール出力は次のとおりです。
router: object Error true true
error handler: string String false false
に置き換えるnew APIError("notAllowed")
とnew Error("notAllowed")
、オブジェクトが保存され、リクエストによって次の出力が生成されます。
router: object Error false true
error handler: object Error false true
Error のインスタンスであるにもかかわらず、カスタム Error オブジェクトが変換されるのはなぜですか?