Как передать параметр в express.маршрутизатор с JS?

вот модифицированный пример из 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);

4 ответов


вот что я придумал: я передаю "конфигурацию мини-приложения", назначив ее 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-адресу, вы можете вводить такие параметры:

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);

можно использовать req.baseUrl чтобы выяснить это.


Вы можете добавить параметры маршрута, как так:

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');
});