节点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?
我觉得有责任强烈警告你,不要凌驾本地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); }); };
你需要用你自己的用户脚本来覆盖你想要的。