2

我目前正在开展一个项目,其中一个核心 Node.js 模块 (dns) 的行为方式不符合我的需要。我发现了一个似乎可以替代的模块:https ://github.com/tjfontaine/node-dns 。但是,使用 DNS 模块的代码比我编写的应用程序代码低了好几层。我正在使用请求模块(https://github.com/mikeal/request),它发出 HTTP 请求并使用几个核心模块来执行此操作。Request 模块似乎没有直接使用 DNS 模块,但我假设其中一个核心模块正在调用 DNS 模块。

有没有办法告诉 Node 在调用require('dns') 时使用https://github.com/tjfontaine/node-dns ?

4

3 回答 3

4

是的,你不应该,

require.cache 是一件非常危险的事情。如果您不知道自己在做什么并且缓存不匹配,这可能会导致内存泄漏,这可能会更糟。大多数更改核心模块的请求也可能导致意外的副作用(例如 DNS 的可发现性失败)。

您可以使用以下内容创建用户空间要求:https ://github.com/bmeck/node-module-system ;然而,这面临同样的危险,但与核心没有直接关系。

我的建议是用 require('async').memoize 包装你的 require('dns').resolve,但要注意 DNS 可发现性可能会失败。

于 2013-08-14T15:00:45.167 回答
3

无论好坏,我在执行如下所示的操作之前已经实现了模块白名单。在您的情况下,应该可以显式检查dns模块名称并将其他所有内容委托给 original 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 */
}
于 2013-08-14T15:47:32.337 回答
0

并不真地。

require是每个模块本地的核心 var,所以你不能存根它,因为 Node 会将未触及的requirevar 提供给加载的模块。

vm您可以使用该模块运行这些东西。但是,您将不得不编写太多代码来执行“简单的解决方法”(将所有需要的变量提供给请求模块,存根需要的变量以使其正常工作,等等......)。

于 2013-08-14T14:35:50.503 回答