2016-08-23 102 views
2

我有,我有我自己的自定義錯誤Node.js的項目:類型錯誤:Object.setPrototypeOf呼籲null或undefined

'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
require('util').inherits(module.exports, Error); 
module.exports = CustomError; 

顯然module.exports是在第一線的undefined.prototype一個空的對象。你需要在之後調用inherits你創建構造函數!向下移動線條,或者使用

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

即使在頂部也會工作,因爲懸掛了函數聲明。

This used to work fine.

不完全是,但它沒有拋出錯誤before node v6

+0

'module.exports === exports === {}',默認情況下它不是'undefined'。 – mscdex

+0

@mscdex正確,固定。 'setPrototypeOf'不直接調用 – Bergi

+0

現在看來它真的很明顯,它指出了我!對於它的工作方式,我仍然有點困惑。我開始懷疑代碼是否發生了變化,但是git的歷史記錄卻說明了這一點,並且它正在生產中使用舊版本的Node。 –

1

看到,因爲我升級節點嘗試一些細微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似乎已經回答了被問到的問題。