首页 > 解决方案 > 在 NodeJS 上的其他模块上需要一个模块如何在入口点上可用?

问题描述

这可能是一个重复的问题,但我找不到任何东西。由于我正在学习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;

做了测试后,错误正确写入文件,我的问题是:它是如何工作的?如何从 error.js 的其他所需版本中看到在 index.js 中对 winston 的“所需版本”所做的设置?

从 index.js 我们也导入了 error.js,所以我可以想象这两个模块以某种方式共享这个 winston 对象,但同样,我不明白它是如何或在哪里共享的。

再次,如果我在这里没有使用正确的术语来引用任何内容,请原谅,我会接受任何建议。

谢谢。

标签: node.jsrequirewinston

解决方案


当一个模块在 node.js 中加载时,它会被require()子系统缓存。因此,当您require()再次执行此操作时,这意味着您将获得与前一个完全相同的模块。

所以......如果您在第一次加载模块后对其进行了初始化,并且该模块存储了一些表示该初始化的状态,那么该模块的后续使用将使用相同的(已经初始化的)模块。

在我们在课程中创建的用于处理错误的其他模块中,他需要 winston 并简单地调用来记录错误。

winston它获取先前已初始化/配置的模块的相同实例。

做了测试后,错误正确写入文件,我的问题是:它是如何工作的?如何从 error.js 的其他所需版本中看到在 index.js 中对 winston 的“所需版本”所做的设置?

如上所述的模块缓存。只有一个winston模块是共享的,所以如果它在一个地方初始化/配置,所有人都将使用该配置。


推荐阅读