如何将参数传递给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);
这是我想出来的:我通过“微型应用程序配置”由它分配给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);
是的,我已经想到了,但它也会匹配'/恐龙/约'。我想避免这种情况。 – Sergey
你可以简单地在未知的动物情况下调用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¶m2=sometext get these params from request object as well:
console.log(req.query.param1, req.query.param2); // 1, 'sometext'
res.send('About birds');
});
router.ge('/ birds/about',...)例如? –
@DavidHaim:我有一组相关的路线(一个“迷你应用程序”)。我希望能够重复使用它们而不重复,否则,如果我添加另一条路线,我将不得不复制'/鸟'和'/ fish'的更改,这很容易出错 – Sergey