#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
или a400
. Это придирки, но REST потрясающий 🙂 Я также обновил ответ