Me gustaría exponer un valor a todos los controladores de solicitudes usando express & typescript. Me gustaría poder "inyectar" este valor desde un middleware (o de alguna otra manera), el punto es que debería ser fácil burlarse de él en caso de que lo necesite.
Se me ocurrió esta solución:
// The context type, I'd like to be able to inject this using the middleware below. // In a real scenario think of this like a database connection, etc. type RequestContext = { foo: string } // The type enriching the Request type with the context field type HasContext = { context: RequestContext } // Middleware attaching the context to the request const contextMiddleware = (context: RequestContext) => (req: Request & Partial<HasContext>, _res: Response, next: NextFunction) => { req.context = context next() } // Now an actual route using the extra type const mainRoute = express.Router().get('/test', (req: Request & HasContext, res) => { res.json({ context: req.context }) }) // Adding the middlewares and listen app.use(contextMiddleware({ foo: 'bar' })) app.use(mainRoute) app.listen(8000)Mis preguntas:
Request & HasContext debe definirse en cada solicitud que use este contexto. ¿Hay una mejor manera?Puede sobrescribir la interfaz de Request expresa para incluir su propiedad de context . De esta manera, no tiene que especificar el tipo en ninguna parte. También mantendrá todas las demás propiedades que normalmente tiene Request .
declare global { namespace Express { interface Request { context: RequestContext } } } Recomendaría no usar el objeto Request para almacenar información. Express recomienda el uso de la propiedad res.locals .