节点JS覆盖标准模块

朋友问了一个有趣的问题,我已经尝试了一些东西,但无济于事,有什么办法来重写节点JS模块?

例如,我想重写readFile函数来使用S3存储区而不是文件系统。 IE:

var fs = require('fs'); fs.readFile('my_text_file.txt', ...); 

实际上运行这样的东西

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

我试过了原型,但似乎他们已经build立了没有__proto__对象的本地模块,他们没有.constructor属性,这对任何人都意味着什么。

我想过使用节点虚拟机,但是这太严格了,因为我希望用户能够通过npm安装模块并使用它们。

最近我实际上是创build一个新的模块(因为我不能把一个名为fs.js的文件放在我的node_modules文件夹中,并且需要它,它只是被忽略),只是硬设置fs的值到我但是这不是很正确,我希望用户使用require('fs')并使用我的自定义函数。

这是否可能没有编译我自己的版本的节点JS?

       

网上收集的解决方案 "节点JS覆盖标准模块"

我觉得有责任强烈警告你,不要凌驾本地function。 这就是说,这将工作:

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); }); }; 

你需要用你自己的用户脚本来覆盖你想要的。