Comment séparer les routes sur Node.js et Express 4?

Je souhaite séparer les routes de mon fichier server.js.

Je suis ce tutoriel sur Scotch.io http://scotch.io/tutorials/javascript/build-a-restful-api-using-node-and-express-4

Cela fonctionne si toutes les lignes sont sur le fichier server.js. Mais je ne parviens pas à séparer. Comment puis-je faire ce travail?

server.js

// set up ====================================================================== var express = require('express'); var app = express(); var bodyParser = require('body-parser'); // configuration =============================================================== app.use(bodyParser()); var port = process.env.PORT || 8000; var mongoose = require('mongoose'); var database = require('./config/database'); mongoose.connect(database.url); var Video = require('./app/models/video'); // routes ======================================================================= app.use('/api', require('./app/routes/routes').router); // listen (start app with node server.js) ====================================== app.listen(port); console.log("ready captain, on deck" + port); module.exports = app; 

Et l’application / routes / routes.js

 var express = require('express'); var router = express.Router(); router.use(function(req, res, next) { console.log('Something is happening.'); next(); }); router.get('/', function(req, res) { res.json({ message: 'hooray! welcome to our rest video api!' }); }); router.route('/videos') .post(function(req, res) { var video = new Video(); video.title = req.body.title; video.save(function(err) { if (err) res.send(err); res.json({ message: 'Video criado!' }); }); }) .get(function(req, res) { Video.find(function(err, videos) { if (err) res.send(err); res.json(videos); }); }); module.exports.router = router; 

En ce qui concerne la séparation des routes du fichier principal est concerné ..

Server.js

 //include the routes file var routes = require('./routes/route'); var users = require('./routes/users'); var someapi = require('./routes/1/someapi'); //////// app.use('/', routes); app.use('/users', users); app.use('/1/someapi', someapi); 

routes / route.js

 //last line - try this module.exports = router; 

Aussi pour le nouveau projet, vous pouvez essayer en ligne de commande

 express project_name 

Vous aurez besoin d’un générateur express pour cela

Server.js

 var express = require('express'); var app = express(); app.use(express.static('public')); //Routes app.use(require('./routes')); //http://127.0.0.1:8000/ http://127.0.0.1:8000/about //app.use("/user",require('./routes')); //http://127.0.0.1:8000/user http://127.0.0.1:8000/user/about var server = app.listen(8000, function () { var host = server.address().address var port = server.address().port console.log("Example app listening at http://%s:%s", host, port) }) 

routes.js

 var express = require('express'); var router = express.Router(); //Middle ware that is specific to this router router.use(function timeLog(req, res, next) { console.log('Time: ', Date.now()); next(); }); // Define the home page route router.get('/', function(req, res) { res.send('home page'); }); // Define the about route router.get('/about', function(req, res) { res.send('About us'); }); module.exports = router; 

* Dans routs.js, vous devez définir Middle ware

ref http://wiki.workassis.com/nodejs-express-separate-routes/

Une autre façon de séparer les routes dans leurs propres fichiers avec Express 4.0:

server.js

 var routes = require('./routes/routes'); app.use('/', routes); 

routes.js

 module.exports = (function() { 'use ssortingct'; var router = require('express').Router(); router.get('/', function(req, res) { res.json({'foo':'bar'}); }); return router; })(); 

Une façon de séparer les routes dans leur propre fichier.

SERVER.JS

 var routes = require('./app/routes/routes'); //module you want to include var app=express(); routes(app); //routes shall use Express 

ROUTES.JS

 module.exports=function(app) { //place your routes in here.. app.post('/api/..., function(req, res) {.....} //example } 

Un problème que je rencontrais tentait de connecter le chemin avec les méthodes lors de l’utilisation de router.use a fini par utiliser cette méthode pour le résoudre. Vous permet de garder le chemin vers un niveau de routeur inférieur au niveau supérieur.

routes.js

 var express = require('express'); var router = express.Router(); var posts = require('./posts'); router.use(posts('/posts')); module.exports = router; 

posts.js

 var express = require('express'); var router = express.Router(); let routeBuilder = path => { router.get(`${path}`, (req, res) => { res.send(`${path} is the path to posts`); }); return router } module.exports = routeBuilder; 

Si vous enregistrez la stack du routeur, vous pouvez réellement voir les chemins et les méthodes

Dans mon cas, j’aime avoir autant de typescript que possible. Voici comment j’ai organisé mes itinéraires avec des classes:

 export default class AuthService { constructor() { } public login(): RequestHandler { return this.loginUserFunc; } private loginUserFunc(req: Request, res: Response): void { User.findOne({ email: req.body.email }, (err: any, user: IUser) => { if (err) throw err; if(!user) return res.status(403).send(AuthService.noSuccessObject()); else return AuthService.comparePassword(user, req, res); }) } } 

A partir de votre server.js ou de votre code serveur, vous pouvez appeler le service AuthService de la manière suivante:

 import * as express from "express"; import AuthService from "./backend/services/AuthService"; export default class ServerApp { private authService: AuthService; this.authService = new AuthService(); this.myExpressServer.post("/api/login", this.authService.login(), (req: express.Request, res: express.Response) => { }); }