是否有可能在Node.js中replace或别名核心模块?

我目前正在一个项目中的一个核心Node.js模块(dns)不以我需要的方式行事。 我已经find了一个模块,它可以作为替代: https : //github.com/tjfontaine/node-dns 。 但是,使用DNS模块的代码与我写的应用程序代码相比有几层。 我使用请求模块( https://github.com/mikeal/request ),它发出HTTP请求,并使用几个核心模块来做到这一点。 请求模块似乎没有直接使用DNS模块,但我假设其中一个核心模块正在调用DNS模块。

有没有一种方式,我可以告诉节点使用https://github.com/tjfontaine/node-dns每当需要(“DNS”)被称为?

是的,你不应该,

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

您可以创build一个用户空间需求,如: https : //github.com/bmeck/node-module-system ; 然而,这面临着同样的危险,但并不直接与核心联系在一起。

我的build议是包装你的require('dns')。用require('async').memoize解决,但要注意,DNS的可发现性可能会翻倒。

无论好坏,在做下面的事情之前,我已经实现了模块白名单。 在你的情况下,它应该是可以显式检查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 */ } 

不是真的。

require是一个对每个模块都是本地的核心variables,所以你不能把它存根,因为Node会将未经改变的require var给予被加载的模块。

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