当我无法访问指向" /: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"。
答案 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
更改为POST
或GET
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发送的请求可能正由第一种方法处理,因为它与路径匹配。您必须首先声明更具体的路径,然后是通用路径。其他情况下,具体的情况不会有效。
更改您将路径划分为中间件的顺序,并告诉我它是否有效。