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
确保所有require
string都是大小写一致的。
无法重现该问题。 为我工作使用版本0.12和4.0.0(同时testing)。
你将来应该考虑的是你使用相对path来引用你的OWN模块(绝对path不是独立于系统的)。 如果不这样做,通常直接引用Node.js的核心模块,或者直接引用NPM安装的核心模块。 所以将“mymodule”改为“./mymodule”(相应地改变path)。