有nodejs GET端点的问题

时间:2020-07-30 07:57:27

标签: javascript node.js express mongoose

我有以下端点:

app.get('/users/:id', async (req, res) => {
const _id = req.params.id;
try {
    const user = await User.findById(_id);

    if(!user) {
        res.status(404).send();
    }

    res.send(user);

} catch (e) {
    res.status(500).send(e);
}});

当我使用有效的用户ID发出请求时,服务器会将用户发回,这没问题。

问题是当我尝试查找ID在数据库中不存在的用户时。服务器应返回 404错误,但它会发回错误500 ,我不明白为什么!

有人可以帮我吗?

提前谢谢!

2 个答案:

答案 0 :(得分:2)

一种处理错误的好方法是创建一个express error middleware,这使您可以将所有错误处理都放在一个地方,这样就不必多次编写它。

当您使用异步路由处理程序时,如果答应拒绝,则使用express时,错误将自动传递给下一个错误中间件。

// First register all of your routes
app.get('/user/:id', async (req, res) => {
  const user = await User.findById(req.params.id);
  if(!user) return res.status(404).send();
  res.send(user);
})

// Then register you error middleware 
app.use((err, req, res, next) => {
  console.error(err.message)
  // if mongoose validation error respond with 400
  if(err.message.toLowerCase().includes('validation failed'))
    return res.sendStatus(400)

  // if moongoose failed because of duplicate key
  if(err.message.toLowerCase().includes('duplicate key'))
    return res.sendStatus(409)

  // if mongoose failed to cast object id
  if(err.message.toLowerCase().includes('objectid failed'))
    return res.sendStatus(404)

  res.sendStatus(500)
})

答案 1 :(得分:0)

谢谢您的回答。

我已解决它,将以下内容添加到用户模型架构中:

_id: {type: String}

并在发送404错误之前添加返回:

app.get('/users/:id', async (req, res) => {
const _id = req.params.id;

try {
    const user = await User.findById(_id);

    if (!user) {
        return res.status(404).send();
    }
    res.send(user);

} catch (error) {
    res.status(400).send(error);
}});