我的问题
我正在编写一个名为 a
的 node
模块,其中 require()
是一个模块 b
(写陌生人)。不幸的是,a
不仅需要访问公共(public)成员——它还需要访问在模块范围内声明的局部变量。
// 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;
我的解决方案
// 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()
等无法从虚拟机
。所以有 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)
我的问题
获取在另一个模块中声明的局部变量的值最简洁的方法是什么?想法?
感谢您的帮助。
最佳答案
您可能永远不必这样做,但可能是有原因的。
您可以 Hook 加载程序并注入(inject) 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();
关于javascript - node.js:从另一个模块访问局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14020189/