Node.js 是否有任何方法可以在需要时修改文件?
我想修改库的代码,比如在需要时插入一些自定义的“代码” 例如:Node.js 是否有任何方法可以在需要时修改文件?,node.js,inject,Node.js,Inject,我想修改库的代码,比如在需要时插入一些自定义的“代码” 例如: const fs = require('fs'); const file = fs.readFileSync('./in').toString(); console.log(file) 因此,我想从fs模块修改函数readFileSync。有没有办法将console.log('hi')注入到readFileSync函数中,以及如何注入?这通常被称为。简言之,您需要将该函数封装在另一个函数中,该函数除了原始行为之外还执行其他操作 例
const fs = require('fs');
const file = fs.readFileSync('./in').toString();
console.log(file)
因此,我想从
fs
模块修改函数readFileSync
。有没有办法将console.log('hi')
注入到readFileSync
函数中,以及如何注入?这通常被称为。简言之,您需要将该函数封装在另一个函数中,该函数除了原始行为之外还执行其他操作
例如:
const fs = require('fs');
const file = fs.readFileSync('./in').toString();
console.log(file)
const fs=require('fs');
函数myReadFileSync(…args){
//如果要在以下时间之前访问console.log:
log('将读取文件');
调用(fs,…args);
//如果在实际操作后需要日志:
log('managed to read the file');
//(当然,你也可以两者兼得)
}
然后,使用myReadFileSync
而不是原始文件。这通常可以通过使用来实现-您可以像插入对象作为依赖项一样插入函数
如果想法是修改“real”fs
模块,不要。这是一种反模式,通过改变代码所依赖的默认行为来污染全局名称空间。这可以在Node.js中完成,但只有在您知道代码的后果时才应该进行。这也是一些测试库(如Jest)的一个问题,它们修改全局对象,这通常是不可取的
话虽如此,以下是如何应用这项技术,称之为:
const fs=require('fs');
//我们需要在某个地方保留原始实现:
const realReadFileSync=fs.readFileSync;
fs.readFileSync=函数myReadFileSync(…args){
//与装饰器中的相同:
调用(fs,…args);
};
最好阅读它,评估它的优缺点,并决定这是否是你想要的代码库