1
votes

Intergiciel express: res.statusCode ne renvoie pas avec précision le code d'état

J'ai une fonction middleware de journalisation assez simple dans une application Express JS:

GET /404 200

Et j'ai cette route:

this.app.use('/404', function (req, res) {
  res.sendStatus(404)
})

Ce qui enregistre ce qui suit:

app.use(function (req, res, next) {
  const line = `${req.method} ${req.originalUrl} ${res.statusCode}`
  console.log(line)
  next()
})

Avec d'autres routes, il semble toujours renvoyer 200.

Comment puis-je résoudre ce problème afin qu'il enregistre avec précision les codes d'état sans changer de route?

Modifier

Mon objectif ici était quelque chose de rapide pour me dire si une route a été touchée et si elle a réussi ou non. Je ne veux pas avoir à modifier tous mes itinéraires pour être compatible avec celui-ci car je vais éventuellement le remplacer par une véritable solution de journalisation.


0 commentaires

3 Réponses :


0
votes

Cela ne fonctionne toujours pas pour tous les itinéraires, mais fonctionne pour plusieurs d'entre eux:

this.app.use(async function (req, res, next) {
  await next()
  const line = `${req.method} ${req.originalUrl} ${res.statusCode}`
  console.log(line)
})


3 commentaires

Notez qu'attendre next () est inutile car il renvoie toujours undefined et jamais une promesse. L'attente passera simplement à la ligne suivante sans attendre. Vous avez réussi à faire fonctionner quelque chose par accident, mais si jamais vous avez du code asynchrone (promesse ou rappel) dans l'un de vos middlewares ou routes, votre enregistreur échouera à nouveau. Express n'est vraiment pas conçu pour prendre en charge votre cas d'utilisation. Si vous avez vraiment besoin d'exécuter un middleware après tout, vous devez appeler next () dans toutes vos routes: stackoverflow.com/questions/24258782/...


Bizarrement, cela fonctionne pour plus de routes avec l'attente là-bas, mais vous avez raison, cela ne les couvre pas tous. Toutes les routes du projet utilisent async / await.


C'est à cause de la conception de wait . Il n'attend que si une promesse est donnée, mais continue silencieusement si vous lui donnez autre chose. Ceci afin que les fonctions puissent éventuellement renvoyer une valeur réelle au lieu d'une promesse si nécessaire, vous n'avez donc pas besoin d'envelopper les valeurs de retour dans un Promise.resolve () redondant. Ce n'est pas que ça ne marche pas c'est juste que ça ne sert à rien



0
votes

0
votes

Je ne connais pas l'intégralité de votre code, mais this.app n'est pas nécessaire. Utilisez directement app.use. Déboguer, en frappant, vous demandez de ne pas entrer dans app.use ('/ 404'), il peut s'agir du chemin de service mentionné ci-dessus comme app.use ('/: variable'), donc peut-être variable == 404. Mentionnez ce type de chemin statique en haut.


0 commentaires