Nodejs + Требовать экземпляра поведения
Я встречаю странное поведение с экземпляром в NodeJs. Я пытаюсь создать модуль, который генерирует исключения, которые могут быть пойманы путем использования модулей и обработаны на основе типа исключения. Однако вызов для проверки типа "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;
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
}
Если я делаю экземпляр test в mymodule.js, например, он возвращает 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
Ответы
Ответ 1
НАЙДЕНА
Чтобы использовать ваш пример, в файле one.js
у меня было:
var mod = require('mymodule');
но в другом файле two.js
у меня было:
var mod = require('mymodule');
и все, казалось, работало точно так же, , кроме случаев, когда вы сравнили ошибку, созданную с помощью one.js
, используя instanceof
в two.js
!.
Абсурдно, node.js позволяет вам делать нечувствительность к регистру, за исключением того, что это не очень чувствительно к регистру, на самом деле это требует вашего файла дважды, поэтому instanceof
возвращает false
- конструкторы представляют собой две разные функции из двух разных экземпляров модуля!
TL; DR
Убедитесь, что все ваши строки require
несовместимы.
Ответ 2
Невозможно воспроизвести проблему. Работа для меня с использованием версий 0.12 и 4.0.0 (проверены оба).
Что вы должны учитывать в будущем, так это то, что вы ссылаетесь на свои OWN-модули, используя относительные пути (абсолютные не зависят от системы). Если вы этого не сделаете, вы обычно ссылаетесь на базовые модули Node.js или NPM. Поэтому измените 'mymodule' на './mymodule' (соответственно измените путь).