Comment séparer les itinéraires et les modèles de app.js à l’aide de NodeJS et Express

Je crée une application à l’aide de Node and Express. Cependant, je vois qu’il sera bientôt difficile de gérer tous les itinéraires placés dans app.js J’ai placé tous mes modèles dans un sous /models répertoire /models .

Voici la structure actuelle de mon application:

 app.js models -- products -- customers -- ... public views node_modules 

Dans app.js :

 var express = require('express'), routes = require('./routes'), user = require('./routes/user'), http = require('http'), path = require('path'), EmployeeProvider = require('./models/employeeprovider').EmployeeProvider, Products = require('./models/products').Products, Orders = require('./models/orders').Orders, Customers = require('./models/customers').Customers, checkAuth = function(req, res, next) { if (!req.session.user_id) { res.send('You are not authorized to view this page'); } else { next(); } }; var app = express(); 

Ensuite, une configuration comme le port , le répertoire des views , le moteur de rendu, etc.

Plus bas app.js j’ai les routes:

 app.get('/product/edit', auth, function(req, res) { Products.findAll(function(error, prds) { res.render('product_edit', { title: 'New Product', products: prds }); }); }); 

En haut, j’assigne le contenu de models/products.js à une variable, tout fonctionne bien. Cependant, conserver tous les itinéraires dans app.js n’est pas idéal. Mais si je déplace les itinéraires vers routes/product.js et charge les modèles de Products :

 var prod = require('../models/products.js'); 

Je reçois une erreur en disant que l’object n’a pas de méthode findAll .

Qu’est-ce que je fais mal? Comment puis-je supprimer les routes de app.js ?

À partir de la version 4.x express, un Router est ajouté pour prendre en charge votre cas.

Un object routeur est une instance isolée de middleware et de routes. Vous pouvez y voir une “mini-application”, capable uniquement d’exécuter des fonctions de middleware et de routage. Chaque application Express possède un routeur d’application intégré.

Exemple du site expressjs :

 // routes/calendarRouter.js var express = require('express'); var router = express.Router(); // invoked for any requested passed to this router router.use(function(req, res, next) { // .. some logic here .. like any other middleware next(); }); // will handle any request that ends in /events // depends on where the router is "use()'d" router.get('/events', function(req, res, next) { // .. }); module.exports = router; 

Puis dans app.js:

 // skipping part that sets up app var calendarRouter = require('./routes/calendarRouter'); // only requests to /calendar/* will be sent to our "router" app.use('/calendar', calendarRouter); // rest of logic 

Puisque je n’aime pas les répétitions, voici ce que je fais:

 // app.js //... var routes = requireDir('./routes'); // https://www.npmjs.org/package/require-dir for (var i in routes) app.use('/', routes[i]); //... 

Et chaque fichier dans les routes est comme:

 // routes/someroute.js var express = require('express'); var router = express.Router(); router.get('/someroute', function(req, res) { res.render('someview', {}); }); module.exports = router; 

De cette façon, vous pouvez éviter les longues listes répétitives comme celle-ci:

 app.use('/' , require('./routes/index')); app.use('/repetition' , require('./routes/repetition')); app.use('/is' , require('./routes/is')); app.use('/so' , require('./routes/so')); app.use('/damn' , require('./routes/damn')); app.use('/boring' , require('./routes/boring')); 

Edit: ces longs exemples supposent que chaque fichier de route contient les éléments suivants:

 var router = express.Router(); router.get('/', function(req, res, next) { // ... next(); }); module.exports = router; 

Tous pourraient être montés sur “root”, mais ce qui pour eux est “root”, est en fait un chemin spécifique donné à app.use , car vous pouvez monter des routes dans des chemins spécifiques (cela permet également de spécifier le chemin avec un regex, Express est assez bien en ce qui concerne ce que vous pouvez faire avec le routage).

Je peux vous suggérer cette structure de fichiers (selon les applications Web Modular avec Node.js et Express de tjholowaychuk ):

 app.js modules users index.js model.js users-api index.js static-pages index.js 

user-api et static-pages exportent des applications expressjs, vous pouvez facilement les monter dans app.js. Dans le module users vous pouvez décrire certaines opérations d’access aux données et toutes les méthodes de manipulation avec l’entité Utilisateur (telles que créer, mettre à jour, etc.). Notre module API utilisera toutes ces méthodes.

Et voici un exemple de code du fichier app.js (sans les éléments express courants, uniquement le assembly de routes à partir de modules différents):

 var express = require('express'); var app = express(); // mount all the applications app.use('/api/v1', require("user-api")); app.use(require("static-pages")); app.listen(3000); 

Pour utiliser vos modules de cette façon, vous devez démarrer votre application de la manière suivante: NODE_PATH=modules node app.js (je mets cette ligne dans le fichier package.json de la section scripts).

Voici un exemple de code du module users :

index.js

 User = require("./model"); module.exports = { get: function(id, callback) { User.findOne(id, function(err, user) { callback(err, user); }); }, create: function(data, callback) { // do whatever with incoming data here data = modifyDataInSomeWay(data); var newUser = new User(data); newUser.save(function(err, savedUser) { // some logic here callback(err, savedUser); }); } }; 

model.js (avec des trucs Mongoose par exemple bien sûr!)

 var mongoose = require('mongoose'); var Schema = mongoose.Schema; var User = new Schema({ firstname : {type: Ssortingng, required: false}, lastname : {type: Ssortingng, required: false}, email : {type: Ssortingng, required: true} }); module.exports = mongoose.model('user', User); 

Et exemple de module user-api (voici l’essentiel de la réponse sur la séparation des itinéraires et des modèles).

 var users = require("users"); var express = require("express"); var app = module.exports = express(); // we export new express app here! app.post('/users', function(req, res, next) { // try to use high-level calls here // if you want something complex just create another special module for this users.create(req.body, function(err, user) { if(err) return next(err); // do something on error res.json(user); // return user json if ok }); }); 

Et exemple de static-pages . Si vous n’allez pas créer une sorte d’interface REST, vous pouvez simplement créer plusieurs modules qui ne rendront que les pages.

 var express = require("express"); var app = module.exports = express(); // we export new express app here again! app.get('/', function(req, res, next) { res.render('index', {user: req.user}); }); app.get('/about', function(req, res, next) { // get data somewhere and put it in the template res.render('about', {data: data}); }); 

Bien sûr, vous pouvez faire ce que vous voulez avec des modules. L’idée principale à propos d’expressjs est d’utiliser beaucoup de petites applications au lieu d’une seule.

A propos des modules nodejs, vous pouvez lire stackoverflow et docs .

J’espère que cela t’aides.