Digamos que tengo una aplicación Express definida en un archivo, digamos server.js así:
const app = express(); app.use('/foo', foo); app.use('/bar', bar); module.exports = app; Importo esta aplicación Express en otro archivo, digamos index.js :
const app = require('./server'); const port = process.env.PORT || 3000; const listen = (port) => { app.listen(port, () => { console.log(`Backend listening on port ${port}!`); }); }; listen(port); Ahora, las rutas que están disponibles para esta aplicación son /foo y /bar .
¿Hay alguna forma de editar la configuración en el archivo index.js para que las rutas se conviertan en /api/foo y /api/bar ? Sin tocar el archivo server.js .
Tengo una aplicación Nuxt.js con un backend que se carga en la aplicación Nuxt a través de la propiedad serverMiddleware en nuxt.config.js así:
serverMiddleware: [ ... { path: '/api', handler: '~/server.js' }, ], Esto tiene un efecto similar al que describí anteriormente: importa la aplicación express de la aplicación server.js y antepone todas sus rutas con /api .
Sin embargo, a menudo no quiero desarrollar la parte frontal de la aplicación Nuxt , solo quiero hacer cambios en el backend. Para este propósito, tengo un archivo de ayuda como index.js arriba, que se ejecuta solo en el backend. (Frontend a menudo toma mucho tiempo para compilar, es por eso que no quiero compilarlo cuando no lo necesito).
Esto crea el problema de que todas las rutas son ligeramente diferentes: carecen de /api al principio. Las rutas se están utilizando en diferentes herramientas como Postman, etc. y de repente no funcionaban.
Mi solución actual es definir el archivo index.js de la misma manera que el archivo server.js con todas las rutas definidas como las quiero, en lugar de app.use('/foo', foo); hay app.use('/api/foo', foo); etc. pero esto tiene sus propios problemas, por ejemplo, si cambio server.js , tengo que cambiar index.js . Busco algo más elegante.
De acuerdo con los documentos express 4.0 https://expressjs.com/en/4x/api.html#app.use , puede usar una instancia de application de la misma manera que lo haría con un router . En resumen, simplemente use la exportación de su server.js como un middleware en la ruta en la que desea insertarlo, en lugar de llamar directamente a .listen() en él.
Aquí hay un código de demostración que funcionó para mí:
const express = require('express'); const app_inner = express(); app_inner.use('/foo', (req,res) => res.send('foo')); const app_outer = express(); app_outer.use('/foo2', app_inner); app_outer.listen(9999); // web browser at localhost:9999/foo2/foo returns 'foo' as expected