如何在Node.js和Express 4上分离路由?

yel*_*uck 57 router node.js express

我想将路由与server.js文件分开.

我正在关注Scotch.io的这个教程 http://scotch.io/tutorials/javascript/build-a-restful-api-using-node-and-express-4

如果所有行都在server.js文件上,则它正在工作.但我没能分开.我怎样才能做到这一点?

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;
Run Code Online (Sandbox Code Playgroud)

和app/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;
Run Code Online (Sandbox Code Playgroud)

Bik*_*h M 62

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)

})
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

*在routs.js中你应该定义中间件

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

  • 这是非常明确的正确答案.做这个. (4认同)

小智 53

就涉及从主文件分离路线而言..

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);
Run Code Online (Sandbox Code Playgroud)

路线/ route.js

//last line - try this
module.exports = router;
Run Code Online (Sandbox Code Playgroud)

同样对于新项目,您可以尝试命令行

express project_name
Run Code Online (Sandbox Code Playgroud)

你需要快速发电机

  • 这并没有真正分离路由,而是分离控制器。@Bikesh 有更正确的解决方案。 (2认同)

jrb*_*ard 23

使用Express 4.0将路径分成自己的文件的另一种方法:

server.js

var routes = require('./routes/routes');
app.use('/', routes);
Run Code Online (Sandbox Code Playgroud)

routes.js

module.exports = (function() {
    'use strict';
    var router = require('express').Router();

    router.get('/', function(req, res) {
        res.json({'foo':'bar'});
    });

    return router;
})();
Run Code Online (Sandbox Code Playgroud)

  • 将整个路径定义包装在*(function(){...})()*构造中有什么好处? (10认同)
  • @SylvainLeroux - 节点具有文​​件级变量范围,因此在这种情况下我可以看到IIFE没有任何好处.它应该被拿出来. (8认同)

Mic*_*len 11

将路由分成自己的文件的一种方法.

SERVER.JS

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

ROUTES.JS

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

  • 我并不是在整个地方传递"app"的忠实粉丝.这不是一个整洁的解决方案. (5认同)

gih*_*uka 6

如果您将express-4.xTypeScript和ES6一起使用,这将是最好的模板;

src/api/login.ts

import express, { Router, Request, Response } from "express";

const router: Router = express.Router();
// POST /user/signin
router.post('/signin', async (req: Request, res: Response) => {
    try {
        res.send('OK');
    } catch (e) {
        res.status(500).send(e.toString());
    }
});

export default router;
Run Code Online (Sandbox Code Playgroud)

src/app.ts

import express, { Request, Response } from "express";
import compression from "compression";  // compresses requests
import expressValidator from "express-validator";
import bodyParser from "body-parser";
import login from './api/login';

const app = express();

app.use(compression());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(expressValidator());

app.get('/public/hc', (req: Request, res: Response) => {
  res.send('OK');
});

app.use('/user', login);

app.listen(8080, () => {
    console.log("Press CTRL-C to stop\n");
});
Run Code Online (Sandbox Code Playgroud)

更清晰和可靠,而不是使用varmodule.exports