#javascript #node.js #express #vue.js
#javascript #node.js #экспресс #vue.js
Вопрос:
У меня возникли некоторые проблемы с обработкой ошибок при вызовах API аутентификации. Когда я отправляю статус 500 из Express, мой интерфейс (в данном случае Vue) получает только сообщение о сбое запроса с кодом состояния 500, а не что-то более полезное для сортировки, например, это худшая ошибка за всю историю (в примере ниже).
В приведенном ниже примере, когда я вызываю ‘/ post’ из API, я выдаю ошибку, которая обрабатывается моим пользовательским промежуточным программным обеспечением. Промежуточное программное обеспечение успешно обрабатывает ошибку и отправляет соответствующий статус моему интерфейсу, но я не могу понять, как отправлять полезные сообщения (например, «это худшая ошибка за всю историю») / получить к ним доступ во внешнем интерфейсе.
Это распространенный вариант использования? Я делаю что-то явно неправильно? Отображается ли отправляемое мной сообщение в параметре (err) или мне нужно добавить соответствующий параметр?
Экспресс-маршрут для ‘/ login’
router.post('/login', (req, res, next) => {
throw Error('this is the worst error ever')
})
Пользовательский экспресс-обработчик ошибок
app.use(function(err, req, res, next) {
res.status(err.status || 500).send({
error: {
status: err.status || 500,
message: err.message || 'Internal Server Error',
},
});
});
Обработайте ответ API в Vue
login (e) {
e.preventDefault();
UserService.login(this.username, this.password) //this is simple axios post call
.catch((err) => {
this.loginStatus = err.message
return
})
}
Комментарии:
1. Есть ли другой способ сделать это, чтобы установить локальные значения в обработчике ошибок в express, а затем получить к ним доступ позже в vue?
Ответ №1:
Нашел ответ на этот вопрос для тех, кто считает это полезным. Обнаруженная ошибка имеет переменную ответа. Именно здесь данные отправляются с помощью команды экспресс-отправки. Смотрите Исправленный код ниже для интерфейса:
login (e) {
e.preventDefault();
UserService.login(this.username, this.password) //this is simple axios post call
.catch((err) => {
this.loginStatus = err.response.data.message
return
})
}
Ответ №2:
Я думаю, вам нужно добавить:
Throw new Error()
вместо
Throw Error
Если вы выполняете асинхронный вызов, вы можете сделать это
app.get('/', function (req, res, next) {
fs.readFile('/file-does-not-exist', function (err, data) {
if (err) {
next(err) // Pass errors to Express.
} else {
res.send(data)
}
})
})
Код должен выглядеть следующим образом:
router.post('/login', (req, res, next) => {
throw new Error('this is the worst error ever')
})
Проверьте это в документации express
Комментарии:
1. новая ошибка () против ошибки () не должна иметь значения, поскольку эта часть приложения работает. Это