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

Ser*_*gey 14 javascript node.js express

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

这版画"关于鸟"当我访问这两个/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);
Run Code Online (Sandbox Code Playgroud)

Ser*_*gey 17

这就是我想出的:我将"mini-app配置"分配给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);
Run Code Online (Sandbox Code Playgroud)

然后在我的路线中我可以访问它们:

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

这种方法允许轻松地将"迷你应用程序"安装在提供不同配置的另一个位置,而无需修改应用程序的代码:

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

  • @Felipe – 云基础设施使用环境来编排服务。因此,我认为使用环境_向应用程序注入全局​​参数_没有什么不好。但是,不应该滥用它在应用程序的不同部分之间传递信息(破坏软件结构),但是当外部配置按照设计在服务器进程的生命周期内不会更改时,这并没有什么坏处。通过环境注入它。 (2认同)

shy*_*kov 8

您基本上是在谈论将配置注入路由器。

我遇到了类似的问题,并发现理论上您不能导出路由器本身,而是可以导出接受配置并返回创建和配置的路由器的功能。

因此,在您的情况下,调用代码将如下所示:

var animal_router = require('./animal_router')

app.use('/birds', animal_router({
    name: 'Bird',
    says: 'chirp'
}));

app.use('/cats', animal_router({
    name: 'Cat',
    says: 'meow'
}));
Run Code Online (Sandbox Code Playgroud)

虽然./animal_router.js可能如下所示:

var express = require('express');

// Create wrapper function that will adjust router based on provided configuration
var wrapper = function (animal_config) {
    var router = express.Router();
    
    router.get('/about', function(req, res) {
        var animal = animal_config;
        res.send(animal.name + ' says ' + animal.says);
    });

    return router;
}

module.exports = wrapper;
Run Code Online (Sandbox Code Playgroud)


van*_*m23 5

因此,如果您想通过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);
Run Code Online (Sandbox Code Playgroud)