Express GET路由不适用于参数

时间:2017-04-04 13:30:06

标签: node.js express mongoose get router

我是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正在运行,我的其他路线正在运行。

3 个答案:

答案 0 :(得分:9)

您似乎正在尝试检索此网址:

/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);
    });
});

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

答案 1 :(得分:1)

这里有两个问题:

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édricDeDycker的答案)。 res.send()只能可靠地使用一次。如果你想做多件事,也许你想要res.write()。此外,您不处理承诺拒绝,因此您不处理数据库错误。要知道为什么你应该总是处理承诺拒绝,请看这个答案:Should I refrain from handling Promise rejection asynchronously?

答案 2 :(得分:0)

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

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