6

朋友提出了一个有趣的问题,我尝试了一些方法但无济于事,有没有办法覆盖 Node JS 模块?

例如,我想覆盖 readFile 函数以使用 S3 存储桶而不是文件系统。IE:

var fs = require('fs');

fs.readFile('my_text_file.txt', ...);

实际上运行这样的东西

FileSystem.readFile = function () {
    // Connect to S3 and retrieve remote file
}

我已经尝试过原型,但似乎他们已经设置了没有__proto__对象的本机模块,他们没有.constructor对任何人都有意义的属性。

我曾考虑过使用Nodes VM,但这太严格了,因为我希望用户能够通过安装模块npm并使用它们。

我实际上最接近的是创建一个新模块(因为我不能将一个名为的文件fs.js放在我的node_modules文件夹中并要求它;它只是被忽略)并且只是将值硬设置为fs我想要的值,但这不是完全正确,我希望用户使用require('fs')和使用我的自定义功能。

如果不编译我自己的 Node JS 版本,这是否可能?

4

1 回答 1

12

我觉得有义务强烈警告您不要重写本机函数。话虽如此,这将起作用:

main.js:

var fs = require('fs'),
    oldReadFile = fs.readFile;

fs.readFile = function (filename, options, callback) {
  console.log('hey!');
  oldReadFile(filename, options, callback)
};

var other = require('./other');
other.test();

other.js:

var fs = require('fs');

exports.test = function () {
  fs.readFile('./main.js', {encoding: 'utf8'}, function (err, data) {
    console.log(err, data);
  });
};

您需要用自己的脚本包装用户的脚本,以首先覆盖您想要的内容。

于 2013-06-13T05:44:16.660 回答