Объекты ошибок не сериализуются хорошо в JSON, потому что некоторые из их свойств не перечисляются и поэтому JSON.stringify()
не включает их, когда res.json(err)
использует его.
Именно поэтому res.json(err)
не делает покажите, что вы хотите.
Возможные причины, по которым неперечислимые свойства не включены, состоят в том, что они могут содержать трассировки стека и другую информацию, которая не предназначена для отправки обратно клиенту. Это просто побочный продукт того, как работает объект Error и как JSON.stringify()
реализован, а res.json()
просто наследует эти проблемы и взаимодействие между ними. Я никогда не понимал, почему основное свойство .message
не перечисляемо, поскольку для меня это никогда не имело смысла, но это так.
Существует несколько возможных решений:
- Вы можете добавить собственный метод
.json2()
, который включает все свойства объекта Error (даже не перечисляемые). - Вы можете использовать Express схему обработки ошибок где вы вызываете
next(err)
, и вы предоставляете централизованный обработчик ошибок, который вызывается, и вы можете выполнить свою собственную сериализацию ответа об ошибке там. - Вы можете создать подкласс Error, который заполнит перечисляемые свойства, которые будут отображаться в JSON и используйте его.
Вариант № 3 может выглядеть следующим образом:
class RouteError extends Error {
constructor(msg, statusCode = 500) {
super(msg);
// define my own enumerable properties so they
// will show up in JSON automatically
this.error = msg;
this.statusCode = statusCode;
}
}
router.post('/users/login', async (req, res) => {
try {
const { email, password } = req.body
const user = await User.findByCredentials(email, password)
console.log(user) //false
if (!user) {
throw new RouteError('Login failed! Check authentication credentials', 401)
}
const token = await user.generateAuthToken()
res.status(200).json({ user, token })
} catch (err) {
console.log(err) //Error: Login failed! Check authentication credentials at C:\Users...
res.status(err.statusCode).json(err);
}
});
В этом примере будет сгенерирован этот ответ:
{"error":"Login failed! Check authentication credentials","statusCode":401}