Node JS覆盖标准模块

时间:2013-06-12 19:58:24

标签: javascript node.js

朋友问了一个有趣的问题,我尝试了一些但是无济于事,有没有办法覆盖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版本,这是否可行呢?

1 个答案:

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

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