在Node中重写require()行为

3
我希望在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中是否可能实现此功能?

我建议将标题编辑为“在Node中覆盖require()行为”,因为您需要用自己的函数替换全局的require()函数。我的第一次尝试是:var _require = require; require = function myRequire(){ ... else _require(arguments)} - Plato
1个回答

3

您可以在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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接