Ошибка отправки ошибки на сторону клиента в NodeJS

#javascript #angularjs #node.js

#javascript #angularjs #node.js

Вопрос:

Я использую асинхронность в NodeJS, и в моем последнем обратном вызове я обрабатываю ошибку и пытаюсь отправить ее обратно на свой контроллер angular.

  function (err, data) {
        if (err) {
            console.log(err);
            res.status(500).send({ err : err});
        }
        else {
            res.json({data: data});
        }
    });
  

Теперь ошибка в консоли.

 [Error: Username is already in use]
  

Я не могу получить эту конкретную ошибку в моем контроллере angular, я пытался отправить ошибку во всех комбинациях, таких как .

    res.status(500).send({ err : err[0]});
      res.status(500).send({ err : err.Error});
  

Это то, что я получаю в своем интерфейсе.

    Object {data: Object, status: 500, config: Object, statusText: "Internal Server Error"}
config
:
Object
data
:
Object
err
:
Object
__proto__
:
Object
__proto__
:
Object
headers
:
(d)
status
:
500
statusText
:
"Internal Server Error"
  

Как я могу перенести это имя пользователя в use error в свой интерфейс.

Комментарии:

1. Что делает ваша функция?

2. res.status(500).send({err : err});, здесь я пытаюсь отправить ошибку, где ошибка [Ошибка: имя пользователя уже используется], но оно не переходит во внешний интерфейс.

3. почему бы не вернуть статус ok с ошибкой 500 для ошибок сервера, а не ошибок проверки данных

4. но я хочу, чтобы [Ошибка: имя пользователя уже используется] отображалось пользователям

5. каково значение {data: Object во внешнем интерфейсе?

Ответ №1:

500 ошибки обычно зарезервированы для ошибок сервера, а не для сценариев, подобных описанному вами. Ошибки сервера должны обрабатываться вашим сервером и элегантно представляться вашему интерфейсу. Ошибки клиента должны быть в 400-х годах. Почему бы вам не попробовать 409 или 400 :

 res.status(409).json({error: "Username is already taken"});
  

Посмотрите на коды состояния HTTP для получения дополнительной информации:

409 Конфликт Запрос не может быть завершен из-за конфликта с текущим состоянием ресурса. Этот код разрешен только в ситуациях, когда ожидается, что пользователь сможет разрешить конфликт и повторно отправить запрос. Тело ответа ДОЛЖНО содержать достаточно информации, чтобы пользователь мог распознать источник конфликта. В идеале объект ответа должен содержать достаточно информации для пользователя или агента пользователя, чтобы устранить проблему; однако это может быть невозможно и не требуется.

Конфликты, скорее всего, возникают в ответ на запрос PUT. Например, если использовалось управление версиями и помещаемая сущность включала изменения в ресурс, которые конфликтуют с изменениями, внесенными более ранним (сторонним) запросом, сервер может использовать ответ 409, чтобы указать, что он не может выполнить запрос. В этом случае объект ответа, скорее всего, будет содержать список различий между двумя версиями в формате, определяемом типом содержимого ответа.

Примечание: Также, в качестве хорошей практики, убедитесь, что вы возвращаете свои res. функции для предсказуемого потока управления, например:

 return res.status(409).json({error: "Username is already taken"});
  

Комментарии:

1. в любом случае, спасибо, я изменил этот обратный вызов (новая ошибка (messages.phonenumberInUse)); на обратный вызов (messages.phonenumberInUse); и теперь я вижу его в своем браузере с этим статусом 406.

2. @sacDahal С чисто RESTful точки зрения, я думаю, вам следует выбрать a 409 или a 400 . Это придирки, но REST потрясающий 🙂 Я также обновил ответ