我在 node.js (0.8.12) 和 express (2.5.8) 中使用自定义错误对象。发生错误时,我想将它们路由到我的自定义错误处理程序,但我的自定义错误对象被转换为字符串,而 native 错误对象保持不变。
这是一个简单的例子:
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 的一个实例?
最佳答案
事实上,出现的字符串根本不是您的错误对象——这是 Express 内部抛出的另一个错误(“非法访问”异常)。当 Express 将错误对象与字符串进行比较时,就会发生错误。
根本原因显然是在您的自定义错误对象上设置了“类型”属性。这显然是 V8 的禁忌——它导致 toString() 抛出“非法访问”异常。更多详情:https://code.google.com/p/v8/issues/detail?id=2397
关于node.js - 为什么我的自定义错误对象会被 Express 路由器转换为字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15557529/