Node JS覆盖标准模块

Dav*_*osh 6 javascript node.js

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

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

var fs = require('fs');

fs.readFile('my_text_file.txt', ...);
Run Code Online (Sandbox Code Playgroud)

实际上运行这样的东西

FileSystem.readFile = function () {
    // Connect to S3 and retrieve remote file
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

如果没有编译我自己的Node JS版本,这是否可行?

Lau*_*rin 11

我觉得有必要强烈警告你不要重写本机功能.话虽如此,这将有效:

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();
Run Code Online (Sandbox Code Playgroud)

other.js:

var fs = require('fs');

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

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