node.js:从另一个模块访问局部变量

时间:2012-12-24 10:37:54

标签: javascript node.js serverside-javascript node-modules

我的问题

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

a

我的解决方案

// 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()等。所以有vm之类的:

ReferenceError

我的问题

哪种获取在另一个模块中声明的局部变量值的最简洁方法?想法?

感谢您的帮助。

3 个答案:

答案 0 :(得分:4)

你应该大部分时间都不应该这样做,但可能有原因。

你可以挂钩加载器并注入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();

答案 1 :(得分:0)

正确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

答案 2 :(得分:0)

签出我的模块import-locals

const patcher = new Patcher();
patcher.export("yourmodule", "Foo");
const { Foo } = require("yourmodule");