2013-08-14 3 views
1

В настоящее время я работаю над проектом, в котором один из основных модулей Node.js (dns) не ведет себя так, как мне это нужно. Я нашел модуль, который, похоже, будет работать как замена: https://github.com/tjfontaine/node-dns. Тем не менее, код с использованием модуля DNS - это несколько уровней от кода приложения, который я написал. Я использую модуль Request(), который обрабатывает HTTP-запросы и использует для этого несколько базовых модулей. Модуль запроса, похоже, не использует модуль DNS напрямую, но я предполагаю, что один из этих основных модулей вызывает модуль DNS.Возможно ли заменить модули или модули с псевдонимом в Node.js?

Есть ли способ, которым я могу указать Узел для использования https://github.com/tjfontaine/node-dns всякий раз, когда требуется ('dns')?

ответ

3

Да и вы не должны,

require.cache опасная вещь, чрезвычайно. Это может привести к утечке памяти, если вы не знаете, что делаете, и несоответствие кеша, что потенциально хуже. Большинство запросов на изменение основных модулей также могут привести к непреднамеренным побочным эффектам (например, сбоям обнаружения с DNS).

Вы можете создать требуемое пространство для пользователя с чем-то вроде: https://github.com/bmeck/node-module-system; однако это сталкивается с теми же опасностями, но напрямую не привязано к ядру.

Мое предложение состоит в том, чтобы обернуть запрос («dns»). Разрешить с требованием («async»). Memoize, но имейте в виду, что обнаружение DNS может упасть.

0

Не совсем.

require - это ядро ​​var, которое является локальным для каждого модуля, поэтому вы не можете его заглушить, потому что Node предоставит нетронутый require var загруженному модулю.

Вы можете использовать эти вещи, используя модуль vm. Однако вам придется писать слишком много кода, чтобы выполнить «простой обходной путь» (предоставить все необходимые переменные модулю запроса, заткнуть необходимые, чтобы они работали правильно и т. Д. И т. Д.).

3

К сожалению, я реализовал белые списки модулей, прежде чем делать что-то, как показано ниже. В вашем случае должно быть возможно явно проверить имя модуля dns и делегировать все остальное оригиналу require(). Однако эта реализация предполагает, что вы полностью контролируете, когда и как выполняется ваш собственный код.

var _require = constructMyOwnRequire(/*intercept 'dns' and require something else*/); 

var sandbox = Object.freeze({ 
    /* directly import all other globals like setTimeout, setInterval, etc.. */ 
    require : Object.freeze(_require) 
}); 

try { 
    vm.runInContext(YOUR_SCRIPT, Object.freeze(vm.createContext(sandbox))); 
} catch (exception) { 
    /* stuff */ 
}