13

我在 NodeJs 中遇到了 instanceof 的奇怪行为。我正在尝试创建一个引发异常的模块,这些异常可以通过使用模块来捕获并根据异常类型进行处理。然而,测试类型“ 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;

我的消费模块.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,但在将其与另一个模块创建的异常进行比较时,它不会。

我的消费模块.js

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

2 回答 2

10

找到了

要使用您的示例,在文件中one.js我有:

var mod = require('mymodule');

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

var mod = require('Mymodule');

一切似乎都完全一样,除了你比较了one.js使用instanceofin产生的错误two.js.

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

TL;博士

确保所有require字符串大小写一致。

于 2015-09-22T19:54:53.930 回答
0

无法重现问题。使用版本 0.12 和 4.0.0 为我工作(都经过测试)。

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

于 2015-09-19T18:03:49.510 回答