在Node.js中安全且正确地monkeypating require函数

时间:2017-03-19 06:09:18

标签: javascript node.js commonjs

在node.js中对require函数进行Monkeypatching可能非常有用,特别是对于某些库。我想弄清楚我怎么能做得对,安全等等。

这就是我所拥有的:

const Mod = require('module');

const req = Mod.prototype.require;

Mod.prototype.require = function () {
  // do some side-effect of your own
  req.apply(this, arguments);
};
然而,这不是很有效,我不知道为什么。我从调试模块中得到了这个错误:

TypeError: Cannot set property 'init' of undefined
    at Object.<anonymous> (/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/node_modules/debug/src/node.js:15:14)
    at Module._compile (module.js:571:32)
    at Object.Module._extensions..js (module.js:580:10)
    at Module.load (module.js:488:32)
    at tryModuleLoad (module.js:447:12)
    at Function.Module._load (module.js:439:3)
    at Module.require (module.js:498:17)
    at Module.Mod.require (/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/lib/index.js:11:9)
    at require (internal/module.js:20:19)
    at Object.<anonymous> (/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/node_modules/debug/src/index.js:9:20)

如果我的代码没问题,那么也许我应该仔细看一下调试模块在做什么?

1 个答案:

答案 0 :(得分:2)

你没有返回结果:

Mod.prototype.require = function () {
  // do some side-effect of your own
  return req.apply(this, arguments);
};

如果没有return,您的包装器将始终返回undefined