Cómo identificar la solicitud (por ID) a través de la cadena de middleware en Express.

Estoy desarrollando un servidor RESTful en node.js, usando Express como framework, y Winston, por el momento, como módulo logger. Este servidor manejará una gran cantidad de solicitudes simultáneas, y me sería muy útil poder rastrear las entradas de registro para cada solicitud específica, utilizando algo como un ‘ID de solicitud’. La solución directa es solo agregar esta ID como otra pieza de información de registro cada vez que quiera hacer una entrada de registro, pero significará pasar la ‘ID de solicitud’ a cada método utilizado por el servidor.

Me gustaría saber si hay algún módulo o técnica de node.js / javascript que me permita hacerlo de una manera más fácil, sin llevar el ID de solicitud para cada solicitud específica.

Puede utilizar el objeto req que viene con cada solicitud en Express.
Así que la primera ruta que harías en tu aplicación sería:

 var logIdIterator = 0; app.all('*', function(req, res, next) { req.log = { id: ++logIdIterator } return next(); }); 

Y luego, en cualquier lugar dentro de Express, puede acceder a ese id en el objeto req : req.log.id ;
Aún deberá pasar algunos datos a funciones que sí quieran crear algunos registros. De hecho, es posible que tenga una función de registro dentro del objeto req.log , de modo que se garantice que el registro ocurrirá solo cuando haya acceso al objeto req.log .

Si realiza un incremento automático, su posterior análisis de registro no podrá identificar las solicitudes de forma única, ya que las diferentes instancias generarán ID de colisión, y el reinicio de la aplicación provocará automáticamente colisiones de ID.

Aquí hay otra solución posible.

Instalar cuid:

 npm install --save cuid 

Luego en su archivo de aplicación principal:

 var cuid = require('cuid'); var requestId = function requestId(req, res, next) { req.requestId = cuid(); next(); }; // Then, at the top of your middleware: app.use(requestId); 

Ahora obtendrá un ID de solicitud amigable que probablemente no colisionará, y podrá identificar de forma única sus solicitudes para su análisis de registros y depuración, incluso en varias instancias y reinicios del servidor.

Estaba luchando por encontrar una solución para este problema. Lo que no me gustó de las soluciones sugeridas aquí es que implican compartir el objeto de solicitud entre todas las funciones a lo largo del proyecto. Descubrí una solución que mezcla su enfoque (creando un uuid por solicitud) y con una biblioteca (almacenamiento de continuación local) que permite compartir espacios de nombres entre módulos.

Puede encontrar la explicación en esta otra respuesta: https://stackoverflow.com/a/47261545/5710581

Si desea obtener más información, anoté todas estas ideas y todo el código en una publicación, con el fin de explicar todo en un solo lugar: Express.js: registro de información con ID de solicitud única global – Node.js

No deberías usar variables globales.

Lo que me gusta hacer es rellenar un objeto META antes de cada solicitud.

Utilizo un generador UUID ( https://github.com/kelektiv/node-uuid ) para identificar una solicitud

Aquí un ejemplo

  app.all('*', function(req, res, next) { req.meta = { ip: req.headers['x-forwarded-for'] || req.connection.remoteAddress, timestamp: uuid(), user_agent: req.headers['user-agent'], body: req.body, } return next(); })