Express:如何将中间件专门添加到路由器对象中的大量路由?

时间:2016-02-29 12:19:37

标签: javascript node.js express

我希望通过堆叠路由器对象来模块化所有路由。

堆叠路由器的问题(用index.js初始化并在路由器对象上添加 router.use)当你想要为特定路由器中的每个路由添加中间件调用(仅限)但是如果路由列表很大 - 试图将中间件放在路由前面以避免必须插入它进入每条路线。

例如:将middleware.doSomething应用于所有路线。

other.js

var express = require('express');
var router = express.Router();
var middleware = require("./middleware");


router.use(middleware.doSomething);

router.get('/routeC', function(req, res){
    ... 
});

router.get('/routeD', function(req, res){
    ... 
});

router.get('/routeE', function(req, res){
    ... 
});

exports.module = router;

问题

一个路由器的中间件处理程序,如middleware.doSomething可以意外地被调用,因为express通过匹配路径从一般到特定的过程(例如“/”然后“/ routeA”然后“/ routeA /: paramA上“)。

例如:当尝试处理“/ routeA”时,将意外调用特定于路由器的中间件router.use(middleware.doSomething);

路线结构

/routes
 -index.js
 -other.js

index.js

var express = require('express');
var router = express.Router();


router.use(require(./other));

router.get('/', function(req, res){
    ... 
});

router.get('/routeA', function(req, res){
    ... 
});

router.get('/routeB', function(req, res){
    ... 
});

exports.module = router;

server.js

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

问题:

我们怎样才能使router.use(middleware.doSomething);专用于它的路由器对象(不将其添加到每个单独的路由),或者通过设计/模式避免这个问题,在我们堆叠其他路由器时可以很好地扩展? (我对使用前缀的任何想法持开放态度,我只是避开它们,因为我也不想为ajax调用添加前缀)。

1 个答案:

答案 0 :(得分:-1)

我相信你也可以,不仅仅是设计,还有你的代码模式,以下是:

假设你有这个main.js

var app = require('express')();

// add universal middle ware
app.use(function(req,res,next){
    console.log("universal");
    next();
    });
// lets assume you have 2 groups of routes, then you pass your express to them.
require('./route01.js')(app);
require('./route02.js')(app);

app.listen(4321);

我们假设这是一个route01组文件

module.exports = function(app)
{
    // universal middleware for routes1
    app.use('/route01',function(req, res, next){
        console.log("universal middleware for routes1")
        next();
        });

    app.get('/route01/option01',function(req,res,next){
        console.log("specific middleware for route 1 option 1");
        next();
        },function(req,res){res.send("OK")});

    app.get('/route01/option02',function(req,res,next){
        console.log("specific middleware for route 1 option 2");
        next();
        },function(req,res){res.send("OK")});
}

这是route02组文件文件

module.exports = function(app)
{
    // universal middleware for routes2
    app.use('/route02',function(req, res, next){
        console.log("universal middleware for routes2")
        next();
        });
    // pass specific middle ware for the routes
    app.get('/route02/option01',function(req,res,next){
        console.log("specific middleware for route 2 option 1");
        next();
        },function(req,res){res.send("OK")});

    app.get('/route02/option02',function(req,res,next){
        console.log("specific middleware for route 2 option 2");
        next();
        },function(req,res){res.send("OK")});
}

例如,您点击http://127.0.0.1:4321/route01/option02,输出将是

  

通用

     

路由1的通用中间件

     

路由1选项2的特定中间件

如果点击http://127.0.0.1:4321/route02/option01,你就会得到

  

通用

     

路由2的通用中间件

     

路由2选项1的特定中间件