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' (соответственно измените путь).