朋友问了一个有趣的问题,我尝试了一些但是无济于事,有没有办法覆盖Node JS模块?
例如,我想覆盖readFile函数以使用S3存储桶而不是文件系统。即:
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版本,这是否可行呢?
答案 0 :(得分: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();
other.js:
var fs = require('fs');
exports.test = function () {
fs.readFile('./main.js', {encoding: 'utf8'}, function (err, data) {
console.log(err, data);
});
};
您需要使用自己的脚本包装用户的脚本,以首先覆盖您想要的内容。