TypeError:Object.setPrototypeOf在null或undefined上调用

时间:2016-08-23 11:08:57

标签: javascript node.js typeerror

我有一个Node.js项目,我有自己的自定义错误:

'use strict';

require('util').inherits(module.exports, Error);

function CustomError(message, extra) {
  Error.captureStackTrace(this, this.constructor);
  this.name = this.constructor.name;
  this.type = 'CustomError';
  this.message = message;
  this.extra = extra;
};

module.exports = CustomError;

这曾经很好用。我可以Throw new CustomError('my message', dataObject)独立于提供错误类型捕获该错误并相应地控制程序流。

但是,由于将Node更新到最新的稳定版本(v6.4.0),它现在已经崩溃了。当我运行单元测试时,我收到错误:

TypeError: Object.setPrototypeOf called on null or undefined
    at Function.setPrototypeOf (native)
    at Object.exports.inherits (util.js:973:10)
    at Object.<anonymous> (CustomError.js:3:17)
    at Module._compile (module.js:556:32)
    at Object.Module._extensions..js (module.js:565:10)
    at Module.load (module.js:473:32)
    at tryModuleLoad (module.js:432:12)
    at Function.Module._load (module.js:424:3)
    at Module.require (module.js:483:17)
    at require (internal/module.js:20:19)

2 个答案:

答案 0 :(得分:2)

require('util').inherits(module.exports, Error);
module.exports = CustomError;

显然module.exports是一个空对象,第一行有undefined .prototype。您需要在之后调用inherits 来创建构造函数!向下移动线,或使用

require('util').inherits(CustomError, Error);

甚至可以在顶部工作,因为函数声明已被提升。

  

这曾经很好用。

不完全,但它没有抛出错误before node v6

答案 1 :(得分:1)

看到我正在升级Node以尝试一些ES6细节,我想我会重构以更现代的方式扩展课程:

'use strict';

module.exports = class CustomError extends Error{
    constructor (message, extra){
          super(message);
          this.name = this.constructor.name;
          this.type = 'CustomError';
          this.extra = extra;
    }
}

我认为这是一个更好的长期解决方案,尽管@Bergi似乎回答了被问到的问题。