我在NodeJs中遇到了与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中执行instanceof测试,那么它返回true
mymodule.js
var a = new MyException()
console.log(a instanceof MyException); //true
但是,如果我在使用模块中创建一个异常并对其进行测试,则会将其正确识别为MyException,而在将其与另一个模块创建的异常进行比较时则不会。
myconsumingmodule.js
var mod = require('mymodule')
var b = new mod.MyException();
console.log(b instanceof mod.MyException); // true
答案 0 :(得分:8)
发现它
要使用您的示例,请在文件one.js
中输入:
var mod = require('mymodule');
但在另一个文件two.js
中,我有:
var mod = require('Mymodule');
并且所有内容似乎完全相同,,除非您使用one.js
中的instanceof
比较two.js
创建的错误!。
荒谬的是,node.js允许你做一个不区分大小写的require,除了它不是真的不区分大小写,它实际上需要你的文件两次,这就是为什么instanceof
返回{ {1}} - 构造函数是两个不同模块实例的两个不同函数!
<强> TL; DR 强>
确保所有false
字符串都符合大小写。
答案 1 :(得分:0)
无法重现问题。使用版本0.12和4.0.0(两者都测试)为我工作。
您将来应该考虑的是使用相对路径引用您的OWN模块(绝对路径与系统无关)。如果不这样做,通常直接引用Node.js的核心模块或NPM安装的核心模块。所以将'mymodule'更改为'./mymodule'(相应地更改路径)。