【问题标题】:Express GET route will not work with parametersExpress GET 路由不适用于参数
【发布时间】:2017-08-29 17:47:24
【问题描述】:

我是 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);
    });
});

这应该可行,对吧?它应该返回具有该 ID 的数据库中的文档。我已经检查了文件是否存在,可能大约 100 次。 现在,如果我大大简化路由,删除 id 并做出简单的响应,那么路由就可以工作了:

router.get('/ama', function (req, res, next) {
    res.send({type:"GET"});
});

太诡异了,一加参数,我就得到一个:

<pre>Cannot GET /api/host/ama</pre>

在邮递员中。

有什么想法吗? Mongod 正在运行,我的其他路线正在运行。

【问题讨论】:

  • 您在哪里调用 /api/host/ama ?只是使用邮递员?当您记录 req.params.id 时,您会得到什么?
  • @CédricDeDycker 是的,我现在使用 Postman。我无法记录 req.params.id,因为看起来路由中的代码甚至从来没有运行过。至少当我尝试记录它时,什么也没发生。

标签: node.js express mongoose get router


【解决方案1】:

您似乎正在尝试检索此 URL:

/api/host/ama?id=SOMEID

但是,您有一个为 URL 声明的路由,如下所示:

/api/host/ama/SOMEID

换句话说,id 是 URL 路径的一部分,而不是作为查询字符串参数传递(这就是 /:id 的意思:它是路由应匹配的 URL 部分的占位符)。

因此,要么通过将 id 添加到路径 (/api/host/ama/58e395a8c6aaca2560089c‌​e7) 来更改请求 URL,要么将您的路由处理程序重写为如下内容:

router.get('/ama', function (req, res, next) {
    Ama.findById(req.query.id).then(function(Ama){
        res.send(Ama);
    });
});

但是,我建议使用前者(使 id 成为 URL 的一部分)。

【讨论】:

  • 我认为你应该再读一遍我的问题。您的解决方案似乎已经是我正在尝试实施的解决方案。
  • @AndreasKristensen 如果你有一条路线/api/host/ama/:id,为什么错误说你正在检索/api/host/ama(没有任何ID)?
  • 我不知道。这是我正在使用的网址:http://localhost:5000/api/host/ama?id=58e395a8c6aaca2560089ce7
  • 感谢您的编辑,现在可以使用了。我想在这里学习,所以你能告诉我,为什么这条其他路线有:router.post('/question/:id',function(req,res,next){ Ama.findByIdAndUpdate( {_id:req.params.id}, {$push:{"qanda": req.body}},{safe:true,upsert:true} ).then(function(question){ res.send(question.qanda); }); }); 使用 id 作为参数?是因为它是一个 POST 请求吗?
  • @AndreasKristensen 所以你要发帖到/api/host/question?id=XXX?这样做是没有意义的,因为 id 要求 在 URL 中(否则该路由将不匹配)。
【解决方案2】:

这里有两个问题:

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()。此外,您不处理承诺拒绝,因此您不处理数据库错误。要了解为什么您应该始终处理承诺拒绝,请参阅此答案:Should I refrain from handling Promise rejection asynchronously?

【讨论】:

  • 第二行 res.send 是复制粘贴的剩余部分,现在已经消失了。
【解决方案3】:

参数应该可以正常工作,但您似乎错过了将 .exec 添加到查询中

Ama.findById(req.params.id).exec().then(function(Ama){
      res.send(Ama);
 })

【讨论】:

  • 不幸的是,这也不起作用。我得到相同的“无法获得”响应。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-17
  • 1970-01-01
  • 2021-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多