Me gustaría interceptar un elemento req.params en una capa de intercepción:
digamos que tengo una instancia de aplicación de servidor express:
const app = express();con una capa de interceptación:
app.use((req, res, next) => { console.log(req.params.myParam); next(); })y muchos puntos finales como este:
app.get('/anything/:myParam', (req, res) => res.send('hello'))esto registra 'indefinido', lo cual es bastante natural porque cuando se ejecuta el middleware de intercepción dentro del "uso", el nombre del parámetro aún no se ha definido. Pero realmente necesito saber en esta capa de intercepción el valor del parámetro myParam con estas restricciones:
¿Alguien sabe una solución para ese caso?
El comentario de @indrajaj26 sobre el uso de app.param() me lleva a una solución funcional.
Aquí está la forma en que estoy procediendo:
/** express application */ const app = express(); // Interception layer app.param('myParam', (req, res, next, myParam) => { /* Store myParam into something reusable (like locals as suggested by @nullromo for instance). * I'm using zonejs in my case: creating a forked zone with myParam stored in zone properties. */ next(); }); // Consuming intercepted data. Anywhere in the callstack of any endpoint using "myParam" as request parameter: console.log(Zone.current.getZoneWith('myParam')?.get('myParam'));¡Gracias a todos por sus ideas!
Una solución simple sería pasar la función de middleware al definir la ruta.
Ejemplo:
function middleware(req, res, next) { console.log(req.params.myParam); next(); } app.get('/path', middleware, function(req, res) { ... });Ejemplo completo:
const express = require('express'); const app = express(); function middleware(req, res, next) { console.log(req.params.myParam); next(); } app.get('/path', middleware, function(req, res) { ... }); app.listen(3000, () => console.log('server is online'));Puede almacenar los parámetros en el objeto response.locals para que los use el middleware posterior.
const express = require('express'); const app = express(); app.get('/:name', (request, response, next) => { // generate some kind of result const result = `Hello, ${request.params.name ?? 'world'}!`; // save the result and the params onto the request.locals object response.locals = { params: request.params, result }; // call the next middleware to pass on the params and result next(); }); app.use((request, response, next) => { // here you have the params since they were parsed by the previous middleware console.log(`Intercepted: ${JSON.stringify(response.locals.params)}`); // now actually send the response that you wanted to send response.status(200).send(response.locals.result); }); app.listen(3000, () => { console.log('listening'); }); Esto requiere almacenar request.params en el objeto response.locals en cada controlador, que no es el mejor. Pero también significa que no tiene que especificar el middleware del interceptor cada vez, si eso es un problema para su caso.