Je veux diviser mes routes en différents fichiers, où un fichier contient toutes les routes et l'autre les actions correspondantes. J'ai actuellement une solution pour y parvenir, mais je dois rendre l'instance d'application globale pour pouvoir y accéder dans les actions. Ma configuration actuelle ressemble à ceci:
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.
};
controllers / index.js:
exports.posts = require('./posts');
exports.index = function(req, res) {
// code
};
controllers / posts.js:
exports.index = function(req, res) {
// code
};
exports.show = function(req, res) {
// code
};
Cependant, cette configuration pose un gros problème: j'ai une base de données et une instance d'application que je dois transmettre aux actions (controllers / *. Js). La seule option à laquelle je pourrais penser est de rendre les deux variables globales, ce qui n'est pas vraiment une solution. Je veux séparer les itinéraires des actions car j'ai beaucoup d'itinéraires et je les veux dans un endroit central.
Quelle est la meilleure façon de transmettre des variables aux actions mais de séparer les actions des routes?
Réponses:
Utiliser
req.app
,req.app.get('somekey')
La variable d'application créée par appel
express()
est définie sur les objets de requête et de réponse.Voir: https://github.com/visionmedia/express/blob/76147c78a15904d4e4e469095a29d1bec9775ab6/lib/express.js#L34-L35
la source
app.set('somekey', {})
app.jsapp.route('/something').get(app.locals.authorized,function(req,res,next){});
n'est pas possible car il est en dehors de la portée de req.Node.js prend en charge les dépendances circulaires.
Utiliser des dépendances circulaires au lieu de require ('./ routes') (app) nettoie beaucoup de code et rend chaque module moins interdépendant de son fichier de chargement:
app.js
routes / index.js
----- Mise à jour 04/2014 -----
Express 4.0 a corrigé le cas d'utilisation pour définir les routes en ajoutant une méthode express.router ()!
documentation - http://expressjs.com/4x/api.html#router
Exemple de leur nouveau générateur:
Écriture de l'itinéraire:
https://github.com/expressjs/generator/blob/master/templates/js/routes/index.js
Ajout / namespacing à l'application: https://github.com /expressjs/generator/blob/master/templates/js/app.js#L24
Il existe encore des cas d'utilisation pour accéder à des applications à partir d'autres ressources, les dépendances circulaires restent donc une solution valide.
la source
app.js
vous ayez besoin du fichier de routage après l' exportation de l'application. Lesrequire()
appels circulaires peuvent créer un véritable gâchis, alors assurez-vous de savoir comment ils fonctionnent !app
AVANT que l'application nemodule.exports
soit définie. Vous devez instancierapp
, définirmodule.exports
, puis exiger des fichiers qui pourraient nécessiterapp
Mais de toute façon, faire les dépendances circulaires est un anti-modèle que Express a résolu - vous ne devriez plus avoir besoin de le faire.Comme je l'ai dit dans les commentaires, vous pouvez utiliser une fonction comme module.exports. Une fonction est également un objet, vous n'avez donc pas à modifier votre syntaxe.
app.js
controllers.js
contrôleurs / index.js
la source
controllers
fonction, quelque chose comme: jsfiddle.net/mihaifm/yV79KOu faites simplement ça:
à l'intérieur du middleware que vous utilisez pour ces routes. Comme ça:
la source
app.use('my-service', serviceInstance)
dans le routeur principal etreq.app.get('my-service')
dans le contrôleur comme mentionné par @FengDisons que vous avez un dossier nommé "contollers".
Dans votre app.js, vous pouvez mettre ce code:
... et ...
dans vos contrôleurs forlder vous aurez le fichier "ping.js" avec ce code:
Et c'est ça ...
la source
Le dernier app.js:
Une autre version: vous pouvez personnaliser cela en fonction de vos propres besoins, comme l'ajout d'une demande de publication
la source
Pour la base de données, séparez le service d'accès aux données qui effectuera tout le travail de base de données avec une API simple et évitera l'état partagé.
Séparer routes.setup ressemble à une surcharge. Je préférerais plutôt placer un routage basé sur la configuration. Et configurez les routes en .json ou avec des annotations.
la source