覆盖节点中的require()行为

我正在为Node中的项目创build一个基于权限的插件系统。 为了便于写作和其他原因,我想让自己调用一个插件:

var plugin = require('plugin');

这里的技巧,我想强制plugin使用我的权限API系统,但我想插件作家能够做到这样的事情:

var library = require('library');

这将需要的是能够创build我自己的require()方法,并将其传递给插件/模块,使他们正在使用我的方法没有任何工作。 我的方法(原始)会像这样工作:

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

这是可能的节点?

您可以覆盖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"); }; 

一些警告(除了弃用):

  • 这个函数将被调用所有的模块(包括dependencies-dependencies),所以meetsPermissions()应该是相对较快的
  • 它似乎并没有被调用内置模块( utilhttp等)

另一个可能的解决scheme是使用vm模块运行沙箱中的所有代码。 有各种更高级别的模块可以提供这个function,比如node-sandboxed-module