3

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 オブジェクトが変換されるのはなぜですか?

4

2 に答える 2

3

実際に起こっていることは、表示される文字列がエラー オブジェクトではないということです。これは、Express の内部でスローされる別のエラー (「不正アクセス」例外) です。Express がエラー オブジェクトを文字列と比較しているときに、エラーが発生しています。

根本的な原因は、明らかにカスタム エラー オブジェクトの "type" プロパティを設定していることです。これは明らかに V8 では禁止されています。これにより、toString() が「不正アクセス」例外をスローします。詳細はこちら: https://code.google.com/p/v8/issues/detail?id=2397

于 2013-03-21T22:56:09.257 に答える
2

これを試して。APIErrorが名前付き関数になっていることに注意してください。

var util = require('util');

関数 APIError(タイプ) {
    Error.call(これ、{
        メッセージ: タイプ、
        constructorOpt: API エラー
    });
    this.name = 'APIError';
}
util.inherits(APIError、エラー);
APIError.prototype.name = 'APIError';

また、こちらもご覧ください。

于 2013-03-21T21:22:25.513 に答える