【问题标题】:How do we pass parameters to a mounted route in nodeJS?我们如何将参数传递给 nodeJS 中的挂载路由?
【发布时间】:2020-09-09 21:02:26
【问题描述】:

我正在学习关于 NodeJS 的课程,有一些与路由相关的作业,除了这部分看起来有点奇怪之外,一切正常:由于某种原因,我无法读取传递给已安装路由器的参数 ID。

dish.js

const express = require('express');
const bodyParser = require('body-parser');
const dishRouter = express.Router();

dishRouter.use(bodyParser.json());

dishRouter.route('/')
.all((req,res,next) => {
    res.statusCode = 200;
    res.setHeader('Content-Type','text/plain');
    next();
})
.get((req,res) => {
    console.info('Info: ',req);
    res.end(`Sending details of the dish back to you: ${req.params.dishId}`);
})
.post((req,res) => {
    res.statusCode = 403;
    res.end(`Operation not supported: ${req.params.dishId}`);
})
.put((req,res) => {
    res.write(`Updating the dish...: ${req.params.dishId} \n` );
    res.end(`Will update this dish: ${req.body.name} with details: ${req.body.description}`);
})
.delete((req,res) => {
    res.end(`Deleting this dish: ${req.params.dishId}`);
});

exports.dish = dishRouter;

dishes.js

const express = require('express');
const bodyParser = require('body-parser');
const dishesRouter = express.Router();

dishesRouter.use(bodyParser.json());

dishesRouter.route('/')
.all((req,res,next) => {
    res.statusCode = 200;
    res.setHeader('Content-Type','text/plain');
    next();
})

.get((req,res) => {
    res.end('Sending all dishes back to you');
})  

.post((req,res) => {
    res.end(`Will add the dish: ${req.body.name} with details: ${req.body.description}`);
})

.put((req,res) => {
    res.statusCode = 403;
    res.end(`Operation not supported.`);
})

.delete((req,res) => {
    res.end(`Deleting all dishes.....`);
});

exports.dishes = dishesRouter;

index.js

const express = require('express');
const morgan = require('morgan');
const bodyParser = require('body-parser');
const http = require('http');
const dishRouter = require('./routes/dish');
const dishesRouter = require('./routes/dishes');
const hostname = 'localhost';
const port = 3000;

const app = express();
app.use(morgan('dev'));
app.use(bodyParser.json());

app.use('/dishes',dishesRouter.dishes);
app.use('/dishes/:dishId',dishRouter.dish);

app.use(express.static(__dirname+'/public'));

app.use((req,res,next) => {
    res.statusCode = 200;
    res.setHeader('Content-Type','text/html');
    res.end('<html><body><h1>This is an Express Server</h1></body></html>');
});

const server = http.createServer(app);

server.listen(port,hostname,(req,res) => {
   console.info(`Server running on port: ${port}, at: ${hostname}`);
})

此 GET localhost:3000/dishes/123 正在调用正确的路由,但参数 discId 返回为“未定义”。同样,只是学习 nodeJS,似乎我的接收器/安装的路由应该可以很好地接收这些参数,可以正确读取正文,但不能正确读取参数。 ...谢谢。

【问题讨论】:

    标签: node.js express express-router path-parameter


    【解决方案1】:

    是的,参数不会在路由器之间流动。你在一个新的路由器上,因此是新的路由参数对象。

    您可以查看以下代码: https://github.com/expressjs/express/blob/master/lib/router/index.js#L43 查看第 43 行和第 53 行,其中 route.params 设置为空对象。

    一些例子:

    index.js

    app.use('/dishes/:dishId',(req, res) => {
      console.log('now I get my dishId', req.params.dishId)
    });
    

    dish.js(版本 1)

    dishRouter.route('/')
    .get((req, res) => {
      console.log('now i get nothing', req.params)
    })
    

    dish.js(第 2 版)

    dishRouter.route('/:anotherId')
    .get((req, res) => {
      console.log('now we get another parameter', req.params.anotherId)
    })
    // the path would be /dish/123/456
    

    我不确定是否有官方 expressjs 方式在路由器之间传递 params 对象。

    一种解决方案是创建自定义处理程序

    index.js

    app.use('/dishes/:dishId', handler)
    

    handler.js

    function handler (req, res, next) {
      if (req.method === 'GET') {
        console.log('now we get it', req.params)
      }
    }
    
    module.exports = handler
    

    另一种方法是在调用路由器之前将 discId 添加到请求对象:

    index.js

    app.use('/dishes/:dishId', (req, res, next) => {
      req.dishId = req.params.dishId
      router(req, res, next)
    })
    

    dish.js

    const express = require('express')
    const router = express.Router()
      router.route('/')
      .get((req, res) => {    
        console.log('nothing here', req.params)
        console.log('dishId', req.dishId)
      })
    
    module.exports = router
    

    第三种方法是将参数作为选项发送到路由器功能

    index.js

    app.use('/dishes/:dishId', (req, res, next) => {
      router(req.params)(req, res, next)
    })
    

    dish.js

    function createRouter (options) {
      const router = express.Router()
      router.route('/')
      .get((req, res) => {    
        console.log('nothing here', req.params)
        console.log('but alot here', options)
      })
    
      return router
    }
    
    module.exports = createRouter
    

    如果您愿意,也可以将 :dishId 作为可选参数放在路由器上

    index.js

    app.use('/dishes', dishesRouter)
    

    dishes.js

    const express = require('express')
    const router = express.Router()
    
    router.route('/:dishId?')
      .get((req, res) => {        
        if (req.params.dishId) {
          res.end(`Sending details of the dish back to you: ${req.params.dishId}`)
        } else {
          res.end('Sending all dishes back to you');
        }
      })
    
    module.exports = router
    

    【讨论】:

    • 谢谢,我选择了您的选项(如下)。我想,无论如何它只是一个单例,我可以像你说的那样以这种方式传递捕获的参数。 (谢谢) app.use('/dishes/:dishId', (req, res, next) => { req.dishId = req.params.dishId router(req, res, next) })
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-21
    • 1970-01-01
    • 2018-06-20
    • 2020-08-09
    • 1970-01-01
    • 2023-03-20
    相关资源
    最近更新 更多