如何将参数传递给express.js路由器?

问题描述:

下面是Express.js的routing guide变形例:如何将参数传递给express.js路由器?

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

router.get('/', function(req, res) { 
    res.send('Birds home page'); 
}); 

router.get('/about', function(req, res) { 
    res.send('About birds'); 
}); 

... 
app.use('/birds', router); 
app.use('/fish', router); 

这版画“关于鸟”当我访问这两个/birds/about/fish/about

如何向路由器传递参数或其他信息,所以在控制器功能中,它可以将这两种不同的路线分开吗?

例如,当访问/birds/about时,我想看到“鸟可以飞”,当访问/fish/about时,我会看到“鱼可以游”。

理想情况下,我希望能够通过一些“配置对象”,所以小应用程序并不需要了解所有可能的途径也可以安装在(在伪代码):

router.get('/about', function(req, res) { 
     res.send(magic_configuration.about_text); 
    }); 
    .... 
    magically_set_config(router, {about_text: "Bears eat fish"}) 
    app.use('/bears', router); 
+0

router.ge('/ birds/about',...)例如? –

+0

@DavidHaim:我有一组相关的路线(一个“迷你应用程序”)。我希望能够重复使用它们而不重复,否则,如果我添加另一条路线,我将不得不复制'/鸟'和'/ fish'的更改,这很容易出错 – Sergey

这是我想出来的:我通过“微型应用程序配置”由它分配给req:在我的路线

app.use('/birds', function (req, res, next) { 
    req.animal_config = { 
     name: 'Bird', 
     says: 'chirp' 
    }; 
    next(); 
}, animal_router); 

app.use('/cats', function (req, res, next) { 
    req.animal_config = { 
     name: 'Cat', 
     says: 'meow' 
    } 
    next();   
}, animal_router); 

,然后我可以访问它们:

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

... 

router.get('/about', function(req, res) { 
    var animal = req.animal_config; 
    res.send(animal.name + ' says ' + animal.says); 
}); 

此方法允许轻松地将“迷你应用程序”安装在提供不同配置的其他位置,而无需修改应用程序代码:

app.use('/bears', function (req, res, next) { 
    req.animal_config = { 
     name: 'Bear', 
     says: 'rawr' 
    }; 
    next(); 
}, animal_router); 

所以,如果你想为通过URL的变化,那么你可以注入PARAMS这样的:

router.get('/:animal/about', function(req, res) { 
    // here we have bird or fish in req.params.animal 
    if(req.params.animal == 'bird') { 
     res.send('Birds can fly'); 
    } else if(req.params.animal == 'fish') { 
     res.send('Fish can swim'); 
    } else { 
     res.send('Unknown animal'); 
    } 
}); 
app.use('/', router); 
+0

是的,我已经想到了,但它也会匹配'/恐龙/约'。我想避免这种情况。 – Sergey

+0

你可以简单地在未知的动物情况下调用next()。这样任何其他匹配路线都将有机会被调用。 –

您可以添加路线PARAMS像这样:

router.get('/about/:param1/:param2', function(req, res) { 
//then you can call this handler through /about/1/sometext get these params from request object: 
    console.log(req.params.param1, req.params.param2); // 1, 'sometext' 
    res.send('About birds'); 
}); 

或者,您可以通过查询参数发送参数:

router.get('/about', function(req, res) { 
//then you can call this handler through /about?param1=1&param2=sometext get these params from request object as well: 
    console.log(req.query.param1, req.query.param2); // 1, 'sometext' 
    res.send('About birds'); 
}); 

您可以使用req.baseUrl明白这一点。