Nodejs +需要instanceof行为

Eri*_*dor 12 exception-handling require node.js

我在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;
Run Code Online (Sandbox Code Playgroud)

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
}
Run Code Online (Sandbox Code Playgroud)

如果我在mymodule.js中执行instanceof测试,那么它返回true

mymodule.js

var a = new MyException()
console.log(a instanceof MyException); //true
Run Code Online (Sandbox Code Playgroud)

但是,如果我在使用模块中创建一个异常并对其进行测试,则会将其正确识别为MyException,而在将其与另一个模块创建的异常进行比较时则不会.

myconsumingmodule.js

var mod = require('mymodule')
var b = new mod.MyException();
console.log(b instanceof mod.MyException); // true
Run Code Online (Sandbox Code Playgroud)

min*_*vor 9

找到了

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

var mod = require('mymodule');
Run Code Online (Sandbox Code Playgroud)

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

var mod = require('Mymodule');
Run Code Online (Sandbox Code Playgroud)

并且所有内容似乎完全相同,除非您比较one.js使用instanceof中创建的错误two.js!.

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

TL; DR

确保所有require字符串都是大小写一致的.

  • 我希望我能给这个不止一票.经过几个小时的研究(最后大多数人回答了其他一些问题),我刚刚放弃了.在一个文件中我遇到了错误的情况.改变它和瞧!我打赌你是在Mac(像我一样),它有保留大小写,忽略大小写的文件系统语义.我不认为这是NodeJS的错.请将此标记为答案. (3认同)
  • 另一件值得一提的事情(因为我刚刚遇到过)是文件的不同路径也会产生这种效果。因此,引用“../../d.js”的“a/b/c.js”和引用“../d.js”的“a/b.js”将需要“d.js”两次... (2认同)

djK*_*ght 0

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

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