gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 23:17:16 27 4
gpt4 key购买 nike

我的问题

我正在编写一个名为 anode 模块,其中 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com