J'ai une fonction middleware écrite dans mon module logger.js que j'importe ensuite dans app.js et que j'utilise

// ------ 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);

Le code ci-dessus fonctionne sans aucun problème et ma fonctionnalité de journal fonctionne. Cependant, si j'exporte cette fonction de journal de la manière suivante (ajoutez-la à l'objet module.exports), j'obtiens une erreur

// ------ 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...

Quelqu'un peut-il m'expliquer pourquoi cela se comporte différemment et comment corriger le deuxième extrait de code que j'ai ajouté ici ?

0
Kripa Jayakumar 15 mars 2019 à 18:26

2 réponses

Meilleure réponse
app.use(logger.log());

Cela appellera logger.log immédiatement, en ne transmettant aucun argument. Les retours de logger.log seront ensuite transmis à app.use. Puisque vous n'avez transmis aucun argument, next n'est pas défini, ce qui entraîne cette exception.

Au lieu de cela, faites:

app.use(logger.log);

Cela passera logger.log dans app.use. Plus tard, logger.log sera appelé, en passant les bons arguments.

3
Nicholas Tower 15 mars 2019 à 15:36

Ici:

app.use(logger.log());

Vous appelez log, sans aucun argument, et transmettez sa valeur de retour à app.use. Étant donné que log attend et utilise ses paramètres, cela échouera sur next() car la valeur du paramètre next est undefined, car vous n'avez pas transmis d'argument pour cela.

Vous vouliez peut-être simplement passer la fonction dans :

app.use(logger.log);
// No () ---------^
2
T.J. Crowder 15 mars 2019 à 15:29