node.js - 为什么我的自定义错误对象会被 Express 路由器转换为字符串?

标签 node.js express url-routing

我在 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/

相关文章:

node.js - NodeJS Hbase 节俭怪异

node.js - 如何接收数组作为 GraphQL 服务的输入参数的成员?

python - webapp2 CRUD 路由返回 405

python - 在 Django REST 框架 API 根中包含 list_route 方法

node.js - Node.js 和 MongoDb 中同步应用程序的结构

node.js - Node JS : Calling Http Service under Angular JS resolve

node.js - Express.JS 带有我自己的 HTTP 监听器?

javascript - 将 Socket.io 与 Node.js、Express 和 Jade 结合使用

javascript - React Router 无法获取/依赖于 onEnter 函数

javascript - 未捕获的ReferenceError : app is not defined in controller,模块和路由