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)
找到了
要使用您的示例,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
字符串都是大小写一致的.
无法重现问题。使用版本 0.12 和 4.0.0 为我工作(两者都经过测试)。
您将来应该考虑的是使用相对路径引用您自己的模块(绝对路径与系统无关)。如果不这样做,通常会直接引用 Node.js 的核心模块或 NPM 安装的模块。因此,将“mymodule”更改为“./mymodule”(相应地更改路径)。
归档时间: |
|
查看次数: |
1281 次 |
最近记录: |