Quero dividir minhas rotas em arquivos diferentes, onde um arquivo contém todas as rotas e o outro as ações correspondentes. Atualmente tenho uma solução para conseguir isso, porém preciso tornar a instância do aplicativo global para poder acessá-la nas ações. Minha configuração atual é assim:
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');
});
routes.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
};
No entanto, essa configuração tem um grande problema: eu tenho um banco de dados e uma instância de aplicativo que preciso passar para as ações (controladores / *. Js). A única opção que eu poderia pensar é tornar as duas variáveis globais, o que não é realmente uma solução. Quero separar as rotas das ações porque tenho muitas rotas e as quero em um local central.
Qual é a melhor maneira de passar variáveis para as ações, mas separar as ações das rotas?
Respostas:
Use
req.app
,req.app.get('somekey')
A variável do aplicativo criada pela chamada
express()
é definida nos objetos de solicitação e resposta.Veja: https://github.com/visionmedia/express/blob/76147c78a15904d4e4e469095a29d1bec9775ab6/lib/express.js#L34-L35
fonte
app.set('somekey', {})
app.jsapp.route('/something').get(app.locals.authorized,function(req,res,next){});
não é possível porque está fora do escopo de solicitação.Node.js oferece suporte a dependências circulares.
Usar dependências circulares em vez de require ('./ routes') (app) limpa uma grande quantidade de código e torna cada módulo menos interdependente de seu arquivo de carregamento:
app.js
rotas / index.js
----- Atualização de 04/2014 ----- O
Express 4.0 corrigiu o caso de uso para definir rotas adicionando um método express.router ()!
documentação - http://expressjs.com/4x/api.html#router
Exemplo de seu novo gerador:
Escrevendo a rota:
https://github.com/expressjs/generator/blob/master/templates/js/routes/index.js
Adicionando / namespacing ao aplicativo: https://github.com /expressjs/generator/blob/master/templates/js/app.js#L24
Ainda existem casos de uso para acessar o aplicativo de outros recursos, portanto, dependências circulares ainda são uma solução válida.
fonte
app.js
solicitar o arquivo de roteamento após exportar o aplicativo.require()
Chamadas circulares podem ser uma verdadeira bagunça, então certifique-se de saber como elas funcionam !app
ANTES do aplicativomodule.exports
ser definido. Você tem que instanciarapp
, definir emodule.exports
, em seguida, exigir arquivos que podem exigir.app
Mas de qualquer maneira, fazer as dependências circulares é um antipadrão que o express resolveu - você não deve precisar mais fazer isso.Como disse nos comentários, você pode usar uma função como module.exports. Uma função também é um objeto, então você não precisa alterar sua sintaxe.
app.js
controllers.js
controladores / index.js
fonte
controllers
função, algo como: jsfiddle.net/mihaifm/yV79KOu apenas faça isso:
dentro do Middleware que você está usando para essas rotas. Curtiu isso:
fonte
app.use('my-service', serviceInstance)
no roteador principal ereq.app.get('my-service')
no controlador conforme mencionado por @FengDigamos que você tenha uma pasta chamada "contollers".
Em seu app.js, você pode colocar este código:
... e ...
em seus controladores anteriores você terá o arquivo "ping.js" com este código:
E é isso ....
fonte
O app.js final:
Outra versão: você pode personalizar de acordo com suas necessidades, como adicionar solicitação de postagem
fonte
Para banco de dados separado, serviço de acesso a dados que fará todo o trabalho do banco de dados com API simples e evitará estado compartilhado.
Separar routes.setup parece uma sobrecarga. Eu preferiria colocar um roteamento baseado em configuração em vez disso. E configure rotas em .json ou com anotações.
fonte