Nodejs +需要instanceof行为

我遇到了NodeJs中instanceof的一个奇怪的行为。 我试图创build一个模块,抛出exception,可以通过消费模块捕获,并根据exceptiontypes处理。 然而,testingtypes“ error instanceof mod.MyException ”的调用总是返回false。

mymodule.js

function MyException() {} MyException.prototype = new Error(); MyException.prototype.constructor = MyException; function Foo() { throw new MyException(); } exports.Foo = Foo; exports.MyException = MyException; 

myconsumingmodule.js

 var mod = require('mymodule'); try { mod.Foo(); } catch (error) { if (error instanceof mod.MyException) { // always returns false //do error specific handling (never executes) return; } // generic handling } 

如果我在mymodule.js中进行instanceoftesting,就会返回true

mymodule.js

 var a = new MyException() console.log(a instanceof MyException); //true 

但是,如果我在消费模块中创build了一个exception并对其进行testing,那么它将其正确地标识为MyException,但将其与其他模块创build的exception进行比较时不会发生exception。

myconsumingmodule.js

 var mod = require('mymodule') var b = new mod.MyException(); console.log(b instanceof mod.MyException); // true 

find了

要使用你的例子,在文件one.js我有:

 var mod = require('mymodule'); 

但在另一个文件two.js我有:

 var mod = require('Mymodule'); 

和一切似乎工作完全一样, 除了当你比较从one.js使用instanceof two.js创build一个错误!

荒谬的是,node.js允许你做一个不区分大小写的要求,除非它不区分大小写,它实际上需要两次你的文件,这就是为什么instanceof返回false – 构造函数是两个不同模块实例的两个不同的函数!

TL; DR

确保所有requirestring都是大小写一致的。

无法重现该问题。 为我工作使用版本0.12和4.0.0(同时testing)。

你将来应该考虑的是你使用相对path来引用你的OWN模块(绝对path不是独立于系统的)。 如果不这样做,通常直接引用Node.js的核心模块,或者直接引用NPM安装的核心模块。 所以将“mymodule”改为“./mymodule”(相应地改变path)。