Quiero dividir mis rutas en diferentes archivos, donde un archivo contiene todas las rutas y el otro las acciones correspondientes. Actualmente tengo una solución para lograr esto, sin embargo, necesito hacer que la instancia de la aplicación sea global para poder acceder a ella en las acciones. Mi configuración actual se ve así:
app.js:
var express = require('express');
var app = express.createServer();
var routes = require('./routes');
var controllers = require('./controllers');
routes.setup(app, controllers);
app.listen(3000, function() {
console.log('Application is listening on port 3000');
});
route.js:
exports.setup = function(app, controllers) {
app.get('/', controllers.index);
app.get('/posts', controllers.posts.index);
app.get('/posts/:post', controllers.posts.show);
// etc.
};
controladores / index.js:
exports.posts = require('./posts');
exports.index = function(req, res) {
// code
};
controladores / posts.js:
exports.index = function(req, res) {
// code
};
exports.show = function(req, res) {
// code
};
Sin embargo, esta configuración tiene un gran problema: tengo una base de datos y una instancia de aplicación que necesito pasar a las acciones (controladores / *. Js). La única opción que se me ocurre es hacer que ambas variables sean globales, lo cual no es realmente una solución. Quiero separar las rutas de las acciones porque tengo muchas rutas y las quiero en un lugar central.
¿Cuál es la mejor manera de pasar variables a las acciones pero separar las acciones de las rutas?
Respuestas:
uso
req.app
,req.app.get('somekey')
La variable de aplicación creada por la llamada
express()
se establece en los objetos de solicitud y respuesta.Ver: https://github.com/visionmedia/express/blob/76147c78a15904d4e4e469095a29d1bec9775ab6/lib/express.js#L34-L35
fuente
app.set('somekey', {})
app.jsapp.route('/something').get(app.locals.authorized,function(req,res,next){});
no es posible porque está fuera del alcance de req.Node.js admite dependencias circulares.
Hacer uso de dependencias circulares en lugar de require ('./ routes') (app) limpia una gran cantidad de código y hace que cada módulo sea menos interdependiente de su archivo de carga:
app.js
rutas / index.js
----- Actualización 04/2014 -----
Express 4.0 corrigió el caso de uso para definir rutas agregando un método express.router ().
documentación: http://expressjs.com/4x/api.html#router
Ejemplo de su nuevo generador:
Escribiendo la ruta:
https://github.com/expressjs/generator/blob/master/templates/js/routes/index.js
Agregando / espacio de nombres a la aplicación: https://github.com /expressjs/generator/blob/master/templates/js/app.js#L24
Todavía hay casos de uso para acceder a la aplicación desde otros recursos, por lo que las dependencias circulares siguen siendo una solución válida.
fuente
app.js
necesita el archivo de enrutamiento después de exportar la aplicación. Lasrequire()
llamadas circulares pueden ser un verdadero desastre, ¡así que asegúrese de saber cómo funcionan !app
ANTES demodule.exports
definir la aplicación . Debe crear una instanciaapp
, configurarmodule.exports
y luego requerir archivos que podrían requerirapp
Pero de cualquier manera, hacer las dependencias circulares es un anti-patrón que Express ha resuelto, ya no debería necesitar hacer eso.Como dije en los comentarios, puede usar una función como module.exports. Una función también es un objeto, por lo que no tiene que cambiar su sintaxis.
app.js
controllers.js
controladores / index.js
fuente
controllers
la función, algo así como: jsfiddle.net/mihaifm/yV79KO simplemente haz eso:
dentro del Middleware que está utilizando para estas rutas. Como eso:
fuente
app.use('my-service', serviceInstance)
en el enrutador principal yreq.app.get('my-service')
en el controlador como lo menciona @FengDigamos que tiene una carpeta llamada "controladores".
En su app.js puede poner este código:
... y ...
en sus controladores, más adelante tendrá el archivo "ping.js" con este código:
Y esto es ...
fuente
El app.js final:
Otra versión: puede personalizar esto según sus propias necesidades, como agregar una solicitud de publicación
fuente
Para la base de datos, separe el servicio de acceso a datos que hará todo el trabajo de la base de datos con una API simple y evitará el estado compartido.
La instalación de rutas de separación parece un techo. En su lugar, preferiría colocar un enrutamiento basado en la configuración. Y configura rutas en .json o con anotaciones.
fuente