如何将 Express 错误转换为用户友好的消息?

How to convert Express errors into user-friendly message?

我不熟悉编码和学习 Node/Express 并尝试将 MongoDB 错误处理成用户友好的消息。

我在这里阅读了一篇类似的文章,但它涉及在查询 MongoDB 之前清理 mongoose 模式中的数据。

在 Postman 中,我故意创建一个帐户(我正在使用 Mongoose)并使用已在使用的用户名后出现以下错误,在本例中为 'johnsmith'。

我想根据错误发回“用户名已存在”或“电子邮件已在使用”,而不是此错误对象。

是否可以直接使用中间件来完成此操作?

谢谢!

{
// Json error
    "driver": true,
    "name": "MongoError",
    "index": 0,
    "code": 11000,
    "keyPattern": {
        "username": 1
    },
    "keyValue": {
        "username": "johnsmith"
    }
}
// Express Code

router.post(`/api/user/create`, async (req, res) => {
    console.log(req.body)
    const user = await new User(req.body)
    
    try {
        await user.save()
        const token = await user.generateAuthToken()
        res.status(201).send({user, token})
    } catch (err) {
     
        res.status(400).send(err) 
    }
})

我不明白你为什么要在这里使用中间件。我也不认为有中间件可以 'automagically' 为您做到这一点。 你总是可以编写自己的中间件顺便说一句。

但在您的特定情况下,我会在您要创建新用户的地方处理该问题。只有当你想处理多条路线上的东西时,中间件才有意义。

因此,我会在您发现错误的地方简单地处理该问题。 您已经知道当用户名已经存在时 mongoose 传递的错误是什么样子的,因此您可以测试这种情况,例如:

} catch(err) {
    if(err.name === "MongoError" && "keyValue" in err && "username" in err.keyValue) {
       return res.status(409).send({message: "User already exists"})
    }
    else {
      return res.status(500).send(err)
    }
}