覆盖节点中的require()行为

时间:2015-08-18 16:54:27

标签: node.js

我正在寻找为Node中的项目创建基于权限的插件系统。为了便于编写,以及其他原因,我想允许自己用以下内容调用插件:

var plugin = require('plugin');

这是诀窍,我想强制plugin使用我的权限api系统,但我希望插件编写者能够执行以下操作:

var library = require('library');

这需要的是能够创建我自己的require()方法,并将其传递给插件/模块,以便他们使用我的方法而无需更多工作。我的方法(原始)会这样工作:

function myRequire (module) { if(meetsPermissions) return require(module); throw 'You don't have the necessary permissions; }

这在Node中是否可行?

1 个答案:

答案 0 :(得分:2)

您可以在require.extensions中覆盖默认加载器。但是,不推荐使用 ,因此可能会随时从Node.js中删除它。

例如:

var jsloader = require.extensions['.js'];

require.extensions['.js'] = function(module, filename) {
  if (meetsPermissions(module)) return jsloader.apply(this, arguments);
  throw new Error("You don't have the necessary permissions");
};

一些警告(除了弃用之外):

  • 将为所有模块调用此函数(包括依赖项依赖项),因此meetsPermissions()应该相对较快
  • 似乎没有调用内置模块(utilhttp等)

另一种可能的解决方案是使用vm模块在​​沙箱中运行所有代码。有许多更高级别的模块可以提供此功能,例如node-sandboxed-module