这可能是一个重复的问题,但我找不到任何东西。 由于我正在学习NodeJS,我认为我没有使用正确的单词进行搜索,所以很难找到答案。
情况如下:
我目前正在关注NodeJS和编码API的在线课程。 在当前步骤中,我们使用Winston库来记录错误。教师已在Index,js上配置,这是应用程序的入口点,如下所示:
文件:index.js
const winston = require('winston');
const errorHandler = require(./middleware/error.js);
//(...) some other imports
app.use(errorHandler);
winston.add(winston.transports.File,{filename:'logFile.log'});
在我们在课程中创建的其他模块中处理错误,他需要winston并只是调用记录错误。像这样:
档案:error.js
const winston = require('winston');
function errorHandler(err,req,res,next){
winston.error(err.message,err);
res.status(500).send("something failed");
}
module.exports = errorHandler;
进行测试后,错误被正确写入文件,我的问题是:它是如何工作的?如何根据所需版本进行设置' index.js中的winston可以从error.js中的其他所需版本看到吗?
从index.js我们也导入了error.js,所以我可以想象这两个模块正在分享这个winston对象,但同样,我不知道它是如何分享的。
再次请原谅如果我没有使用正确的条款在此提及任何内容,我会接受任何建议。
感谢。
答案 0 :(得分:2)
在node.js中加载模块时,它由require()
子系统缓存。因此,当您再次require()
时,这意味着您将获得与前一个模块完全相同的模块。
所以......如果你在第一次加载模块后初始化模块并且模块存储了一些表示初始化的状态,那么后续使用该模块将使用相同的(已经初始化的)模块。
在我们在课程中创建的处理错误的其他模块中,他需要winston并且只需要调用以记录错误。
它获得了先前已初始化/配置的winston
模块的相同实例。
进行测试后,错误被正确写入文件,我的问题是:它是如何工作的?如何根据所需版本进行设置'可以从error.js中的其他所需版本看到index.js中的winston吗?
如上所述的模块缓存。所有人共享的winston
模块只有一个,所以如果它在一个地方初始化/配置,所有人都将使用该配置。