Nodejs +需要instanceof行为

时间:2013-08-15 21:02:24

标签: node.js exception-handling require

我在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

2 个答案:

答案 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'(相应地更改路径)。