Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 是否有任何方法可以在需要时修改文件?_Node.js_Inject - Fatal编程技术网

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);
};
最好阅读它,评估它的优缺点,并决定这是否是你想要的代码库