Express GET 路由不适用于参数
Express GET route will not work with parameters
我是 Express 和 Mongoose 的新手。我目前正在做我的第一个项目,这不是教程,我 运行 遇到了问题。
我有多个路由,它们在 index.js 中定义如下:
app.use('/api/client',require('./routes/client'));
app.use('/api/host',require('./routes/host'));
在路线中,有多个有效的动词,如 PUT 和 POST。
这是有问题的路线(我正在尝试做更多这里介绍的内容,但这里介绍的内容也不起作用):
router.get('/ama/:id', function (req, res, next) {
Ama.findById(req.params.id).then(function(Ama){
res.send(Ama);
});
});
这应该行得通,对吧?它应该 return 数据库中具有该 ID 的文档。我检查了文件是否存在,大概检查了 100 次左右。
现在,如果我极大地简化路由,删除 id,并做出简单的响应,则路由有效:
router.get('/ama', function (req, res, next) {
res.send({type:"GET"});
});
太奇怪了,只要我添加参数,我就会得到:
<pre>Cannot GET /api/host/ama</pre>
在 Postman 中。
有什么想法吗? Mongod 正在 运行ning,我的其他路由正常。
该参数应该可以正常工作,但您似乎没有将 .exec 添加到您的查询中
Ama.findById(req.params.id).exec().then(function(Ama){
res.send(Ama);
})
这里有两个问题:
router.get('/ama/:id', function (req, res, next) {
Ama.findById(req.params.id).then(function(Ama){
res.send(Ama);
})
res.send(req.params.id)*/
});
首先,res.send(req.params.id)
将在 res.send(Ama);
之前 运行,它可能会发送整个响应。您缺少 .exec()
方法调用(有关详细信息,请参阅 Cédric De Dycker 的回答)。 res.send()
只能可靠地使用一次。如果你想写多个东西,也许你想要 res.write()
。此外,您不处理承诺拒绝,因此您不处理数据库错误。要了解为什么您应该始终处理承诺拒绝,请参阅以下答案:
您似乎正在尝试检索此 URL:
/api/host/ama?id=SOMEID
但是,您为 URL 声明了一条如下所示的路线:
/api/host/ama/SOMEID
换句话说,id 是 URL 路径的一部分,而不是作为查询字符串参数传递(这就是 /:id
的意思:它是一部分的占位符URL 路由应该匹配)。
因此,要么通过将 id 添加到路径 (/api/host/ama/58e395a8c6aaca2560089ce7
) 来更改请求-URL,或者将您的路由处理程序重写为如下内容:
router.get('/ama', function (req, res, next) {
Ama.findById(req.query.id).then(function(Ama){
res.send(Ama);
});
});
不过,我建议使用前者(使 id 成为 URL 的一部分)。
我是 Express 和 Mongoose 的新手。我目前正在做我的第一个项目,这不是教程,我 运行 遇到了问题。
我有多个路由,它们在 index.js 中定义如下:
app.use('/api/client',require('./routes/client'));
app.use('/api/host',require('./routes/host'));
在路线中,有多个有效的动词,如 PUT 和 POST。 这是有问题的路线(我正在尝试做更多这里介绍的内容,但这里介绍的内容也不起作用):
router.get('/ama/:id', function (req, res, next) {
Ama.findById(req.params.id).then(function(Ama){
res.send(Ama);
});
});
这应该行得通,对吧?它应该 return 数据库中具有该 ID 的文档。我检查了文件是否存在,大概检查了 100 次左右。 现在,如果我极大地简化路由,删除 id,并做出简单的响应,则路由有效:
router.get('/ama', function (req, res, next) {
res.send({type:"GET"});
});
太奇怪了,只要我添加参数,我就会得到:
<pre>Cannot GET /api/host/ama</pre>
在 Postman 中。
有什么想法吗? Mongod 正在 运行ning,我的其他路由正常。
该参数应该可以正常工作,但您似乎没有将 .exec 添加到您的查询中
Ama.findById(req.params.id).exec().then(function(Ama){
res.send(Ama);
})
这里有两个问题:
router.get('/ama/:id', function (req, res, next) {
Ama.findById(req.params.id).then(function(Ama){
res.send(Ama);
})
res.send(req.params.id)*/
});
首先,res.send(req.params.id)
将在 res.send(Ama);
之前 运行,它可能会发送整个响应。您缺少 .exec()
方法调用(有关详细信息,请参阅 Cédric De Dycker 的回答)。 res.send()
只能可靠地使用一次。如果你想写多个东西,也许你想要 res.write()
。此外,您不处理承诺拒绝,因此您不处理数据库错误。要了解为什么您应该始终处理承诺拒绝,请参阅以下答案:
您似乎正在尝试检索此 URL:
/api/host/ama?id=SOMEID
但是,您为 URL 声明了一条如下所示的路线:
/api/host/ama/SOMEID
换句话说,id 是 URL 路径的一部分,而不是作为查询字符串参数传递(这就是 /:id
的意思:它是一部分的占位符URL 路由应该匹配)。
因此,要么通过将 id 添加到路径 (/api/host/ama/58e395a8c6aaca2560089ce7
) 来更改请求-URL,或者将您的路由处理程序重写为如下内容:
router.get('/ama', function (req, res, next) {
Ama.findById(req.query.id).then(function(Ama){
res.send(Ama);
});
});
不过,我建议使用前者(使 id 成为 URL 的一部分)。