【问题标题】:Node.js fs error extendingNode.js fs 错误扩展
【发布时间】:2016-03-15 07:58:51
【问题描述】:

我在服务器端有一个文件移动实用程序, 如果目标目录不存在,则返回的错误是(通过网络):

{errno: -2,
code: 'ENOENT',
path: 'uploads/workgroup/message.docx'}

服务器端的一段代码:

fs.rename(oldpath,newpath, function(err) {
  if(err) {
    err.message = 'Target directory does not exist.';
    return res.send(400, err);
  }

如您所见,err.message 被忽略。 如果我创建一个新的错误对象,一切都很好:

fs.rename(oldpath,newpath, function(err) {
  if(err) {
    err.message = 'Target directory does not exist.';
    var err2 = new Error();
    err2.message = err.message;
    err2.code = err.code;
    err2.path = err.path;
    err2.errno = err.errno;
    return res.send(400, err2);
  }

我不知道,为什么不能修改原来的错误对象。 我试过console.log(util.inspect(err, {showHidden: true, depth: null}));,但没有给出太多线索。

任何解释都非常感谢!

【问题讨论】:

  • MDN 文档说你不能修改错误原型:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • @oshnaps - 两件事:1)OP 没有修改错误原型。他们只是向现有对象添加“自己的”属性。 2) 我在 MDN 上读到的内容是:您可以使用构造函数的原型向使用该构造函数创建的所有实例添加属性或方法

标签: json node.js error-handling


【解决方案1】:

当使用传递给构造函数的参数创建错误对象时:

var e = new Error("Some Message Here");

它会创建一个 Error 对象,该对象具有不可枚举的 .message 属性。而且,res.send() 使用的 JSON.stringify() 不包括可枚举的属性。而且,即使您为该属性分配了不同的值,它仍然是不可枚举的。

但是,如果您创建 Error 对象时没有将消息传递给构造函数,然后将 .message 属性分配给它,如下所示:

var e = new Error();
e.message = "Some Message Here";

然后,.message 属性最终成为可枚举的,并将包含在 JSON.stringify() 中。我不知道为什么 V8 引擎会这样做,但确实如此。


属性的可枚举性是可配置的,因此您可以更改它,这样res.send() 将包含它:

fs.rename(oldpath,newpath, function(err) {
  if(err) {
    Object.defineProperty(err, "message", {enumerable: true});
    err.message = 'Target directory does not exist.';
    return res.send(400, err);
  }

或者,您可以使用自己的属性名称,默认情况下可枚举:

fs.rename(oldpath,newpath, function(err) {
  if(err) {
    err.reason = 'Target directory does not exist.';
    return res.send(400, err);
  }

【讨论】:

  • 谢谢。这是一个明确的解释,实际上Object.defineProperty 确实修复了 json(通过网络发送)。我将您的答案标记为已接受。
猜你喜欢
  • 1970-01-01
  • 2014-08-27
  • 2016-09-15
  • 2020-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多