node.js:从另一个模块访问本地variables

我的问题

我正在编写一个名为anode模块,它require() sa模块b (由陌生人编写)。 不幸的是, a不仅需要访问公共成员,还需要访问在模块范围内声明的局部variables。

 // a var b = require('b'); console.log(b.public); console.log(b.private); // undefined // b var c = require('c'); var stdin = process.stdin; exports.public = true; var private = true; 

我的解决scheme

 // a var b = require('b'); var srcPath = require.resolve('b'); console.log(b.public); fs.readFile(srcPath, 'utf-8', function (err, src) { var box = {}; var res = vm.runInNewContext(src, box, srcPath); console.log(box.private); }); 

但是vm并没有将b作为模块运行,所以require()等不能从vm的上下文中访问。 所以有ReferenceError像:

  var res = vm.runInNewContext(src, box, scPath); ^ ReferenceError: require is not defined at <module b> at <module a> at fs.readFile (fs.js:176:14) at Object.oncomplete (fs.js:297:15) 

我的问题

哪个是最简单的方法来获取在另一个模块中声明的局部variables的值 ? 想法?

谢谢你的帮助。

你大概应该永远不必这样做,但可能有原因。

你可以挂钩加载程序并注入JavaScript代码来导出你想要的。

 // let's say you have node_modules/foreignmodule/index.js // and in that script there is a local (not-exported) function foreignfunction(). var path = require('path'); _oldLoader = require.extensions['.js']; require.extensions['.js'] = function(mod, filename) { if (filename == path.resolve(path.dirname(module.filename), 'node_modules/foreignmodule/index.js')) { var content = require('fs').readFileSync(filename, 'utf8'); content += "module.exports.foreignfunction=foreignfunction;\n"; mod._compile(content, filename); } else { _oldLoader(mod, filename); } }; require('foreignmodule').foreignfunction(); 

只需正确export

模块B

 // b.js // some local var var foo = 'Bar'; exports.Foo = foo; exports.Hello = 'World'; 

模块A

 // a .js b = require('./b'); console.log(b.Foo); //=> 'Bar' console.log(b.Hello); // => 'World' 

阅读更多关于nodejs module.exports的信息