Почему я получаю «Next is not function», когда пытаюсь экспортировать функцию Middleware в объект module.exports? - PullRequest
0 голосов
/ 15 марта 2019

В моем модуле logger.js написана функция промежуточного программного обеспечения, которую я затем импортирую в app.js и использую

// ------ File : logger.js ------ //

function log(req, res, next) {
  console.log('Logging details ... ');
  next();
}

module.exports = log;

// ------ File : app.js -------- //

const logger = require('./logger');

app.use(logger);

Приведенный выше код работает без каких-либо проблем, и моя функциональность журнала работает.Однако, если я экспортирую эту функцию журнала следующим образом (добавлю ее в объект module.exports), я получу ошибку

// ------ File : logger.js -------//

function log(req, res, next) {
  console.log('Logging details ... ');
  next();
}
module.exports.log = log;

// ------ File : app.js -------- //

const logger = require('./logger');

app.use(logger.log());

Logging details ...
D:\express-demo-worked\logger.js:4
    next();
    ^

TypeError: next is not a function
    at Object.log (D:\express-demo-worked\logger.js:4:5)
    at Object.<anonymous> (D:\express-demo-worked\app.js:18:16)
    at Module._compile (internal/modules/cjs/loader.js:738:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:749:10)
    at Module.load (internal/modules/cjs/loader.js:630:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:570:12)
    at Function.Module._load (internal/modules/cjs/loader.js:562:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:801:12)
    at internal/main/run_main_module.js:21:11
[nodemon] app crashed - waiting for file changes before starting...

Может кто-нибудь объяснить мне, почему это ведет себя по-другому и как исправить второй фрагмент кода, который я добавил здесь?

Ответы [ 2 ]

3 голосов
/ 15 марта 2019
app.use(logger.log());

Это немедленно вызовет logger.log без аргументов. Все, что возвращает logger.log, будет передано в app.use. Поскольку вы передали без аргументов, next не определено, что приводит к этому исключению.

Вместо этого выполните:

app.use(logger.log);

Это передаст logger.log в app.use. Через некоторое время будет вызван logger.log с правильными аргументами.

2 голосов
/ 15 марта 2019

Здесь:

app.use(logger.log());

вы вызываете log без каких-либо аргументов и передаете возвращаемое значение в app.use.Так как log ожидает и использует свои параметры, это приведет к сбою next(), так как значение параметра next равно undefined, поскольку вы не передали ему аргумент.

Вы можетеозначали просто передать функцию в:

app.use(logger.log);
// No () ---------^
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...