Как требование наличия модуля на точке входа делает доступным другие модули на NodeJS? - PullRequest
0 голосов
/ 03 июня 2018

Это, вероятно, дублированный вопрос, но я ничего не смог найти.Поскольку я изучаю 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;

После выполнения теста, ошибка правильно записывается в файл, и мой вопрос: каконо работает?Как настройки, сделанные для «требуемой версии» winston в index.js, видны из другой требуемой версии в error.js?

Из index.js мы также импортируем error.js, поэтому я могу представить, как эти два модуля совместно используют этот объект winston, но, опять же, я не понимаю, как и где он используется.

Опять же, извините, если я не использую правильные термины, чтобы ссылаться на что-либо здесь, я приму любой совет.

Спасибо.

1 Ответ

0 голосов
/ 03 июня 2018

Когда модуль загружается в node.js, он кэшируется подсистемой require().Итак, когда вы затем require() это снова, это означает, что вы получите точно такой же модуль, как и предыдущий.

Итак ... если вы инициализировали модуль после первой загрузки, и модуль сохраняеткакое-то состояние, которое представляет эту инициализацию, затем последующее использование этого модуля будет использовать тот же (уже инициализированный) модуль.

А в другом модуле, который мы создали в курсе для обработки ошибок, он требуетwinston и просто позвоните, чтобы зарегистрировать ошибку.

Он получает тот же экземпляр модуля winston, который уже был инициализирован / настроен ранее.

После выполнения теста, ошибка правильно записана в файл, и мой вопрос: как это работает?Как установка, сделанная для 'требуемой версии' winston в index.js, видна из другой требуемой версии в error.js?

Кэширование модуля, как описано выше.Существует только один winston модуль, который все совместно используют, поэтому, если он инициализирован / настроен в одном месте, все будут использовать эту конфигурацию.

...