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/58e395a8c6aaca2560089c‌​e7) 来更改请求-URL,或者将您的路由处理程序重写为如下内容:

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

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