表达js route永远不会命中/:id

时间:2018-01-29 08:38:33

标签: javascript express routing axios

当我无法访问指向" /:id"的快速js路线时,我遇到了这种情况。它总是命中" /"我不明白为什么?

我的控制器中的代码如下:

var express = require('express');
var router = express.Router();
var bodyParser = require('body-parser');
var mongoose = require('mongoose');

router.use(bodyParser.urlencoded({
    extended: true
}));
router.use(bodyParser.json());

var Reservation = require('./Reservation');

// GET all reservations
router.get('/', function (req, res) {
    Reservation.find({}).populate('client').exec(function (err, reservation) {
        if (err) return res.status(500).send("Issues retrieving all reservations.");
        res.status(200).send(reservation);
    });
});

// GET only one reservation based on its ID
router.get('/:id', function (req, res) {
    Reservation.findById(req.params.id).populate('client').exec(function (err, reservation) {
        if (err) return res.status(500).send("Issues finding the reservation.");
        if (!reservation) return res.status(404).send("Reservation not found.");
        res.status(200).send(reservation);
    });
});

在我的app.js文件中,我将控制器安装到路径上,如下所示:

var ReservationController = require('./reservations/ReservationController'); 
app.use('/api/reservations', ReservationController);

这就是我尝试使用Axios通过ID检索预订的方式:

axios
  .get('http://localhost:3000/api/reservations/', {
      params: {
        id: '5a6dd589a90c1e83d3c3ebb8'
      }
  })
  .then(response => {
    // handle response
  })
  .catch(e => {
    // handle errors
  })

尝试使用Postman得到相同的结果,我总是得到" /"而不是" /:id"。

2 个答案:

答案 0 :(得分:3)

GET /api/reservations/:id不符。 /:id表示通过将id作为路径参数传递来调用路由。

您可以使用以下方式调用/:id

axios.get('/5a6dd589a90c1e83d3c3ebb8')

匹配/:id。然后你将在路由处理函数中获得req.params.id=="5a6dd589a90c1e83d3c3ebb8"

如果你拨打/api/reservations,它会匹配router.get('/:param1 /:param2'),然后你会得到req.params.param1=="api"req.params.param2=="reservations"

修改(由@ChiragRavindra提供)

如果您打算致电/api/reservations/5a6dd589a90c1e83d3c3ebb8,则需要将匹配的表达式更改为:router.get('/api/reservations/:id', function (req, res) {...} (假设您没有首先将控制器安装在/api/reservations上)。然后你可以调用它:

axios.get('/api/reservations/5a6dd589a90c1e83d3c3ebb8')

如果您希望保持调用与问题中发布的调用相同,则必须将HTTP方法从PUT更改为POSTGET

router.post('/api/reservations', function (req, res) {
    //req.body.params.id === '5a6dd589a90c1e83d3c3ebb8'
});



axios
.post('/api/reservations/', {
    params: {
        id: '5a6dd589a90c1e83d3c3ebb8'
    }
})
.then(response => {
    // handle response
})
.catch(e => {
    // handle errors
})

答案 1 :(得分:0)

问题可能是你先申报了' /'路径比' /:id'。

因此,中间件尝试按照您声明路径的相同顺序匹配每个条目请求。您使用id发送的请求可能正由第一种方法处理,因为它与路径匹配。您必须首先声明更具体的路径,然后是通用路径。其他情况下,具体的情况不会有效。

更改您将路径划分为中间件的顺序,并告诉我它是否有效。