Экспресс-обработка ошибок: отправка сообщения во внешний интерфейс

#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. новая ошибка () против ошибки () не должна иметь значения, поскольку эта часть приложения работает. Это