Я играю с Nodejs и выражаюсь, создавая небольшой API отдыха. У меня вопрос, какова хорошая практика / лучший способ установить статус кода, а также данные ответа?
Позвольте мне объяснить с небольшим количеством кода (я не буду помещать узел и экспресс-код, необходимый для запуска сервера, только соответствующие методы маршрутизатора):
router.get('/users/:id', function(req, res, next) {
var user = users.getUserById(req.params.id);
res.json(user);
});
exports.getUserById = function(id) {
for (var i = 0; i < users.length; i++) {
if (users[i].id == id) return users[i];
}
};
Код ниже работает отлично, и при отправке запроса с почтальоном, я получаю следующий результат:
Как видите, статус показывает 200, что нормально. Но это лучший способ сделать это? Есть ли случай, когда мне нужно было бы установить статус самостоятельно, а также возвращаемый JSON? Или это всегда обрабатывается экспресс?
Например, я только что сделал быстрый тест и немного изменил метод get выше:
router.get('/users/:id', function(req, res, next) {
var user = users.getUserById(req.params.id);
if (user == null || user == 'undefined') {
res.status(404);
}
res.json(user);
});
Как вы можете видеть, если пользователь не найден в массиве, я просто установлю статус 404.
Ресурсы / советы, чтобы узнать больше об этой теме, более чем приветствуются.
Ответы:
Экспресс API ссылка охватывает этот случай.
Смотри статус и отправляй .
Короче говоря, вам просто нужно вызвать
status
метод перед вызовомjson
илиsend
:источник
res.sendStatus(400);
res.sendStatus(400);
тоже отправляет строковые данные, что эквивалентноres.status(400).send('Not Found')
Вы могли бы сделать это так:
Это установит код состояния HTTP на 400, он работает даже в экспресс 4.
источник
express deprecated res.json(status, obj): Use res.status(status).json(obj) instead
Итак,res.status(400).json(json_response)
было бы точно в наше время.res.status(500).send({ error: "boo:(" });
статус 200 будет по умолчанию при использовании
res.send
,res.json
и т.д.Вы можете установить статус как
res.status(500).json({ error: 'something is wrong' });
Часто я делаю что-то вроде ...
Затем сделайте так, чтобы мое промежуточное ПО с ошибкой отправило ответ, и в случае ошибки сделайте все, что мне нужно.
Дополнительно:
res.sendStatus(status)
добавлено с версии 4.9.0 http://expressjs.com/4x/api.html#res.sendStatusисточник
Список кодов состояния HTTP
Хорошая практика в отношении ответа о состоянии заключается в том, чтобы, как и ожидалось, отправлять правильный код состояния HTTP в зависимости от ошибки (4xx для ошибок клиента, 5xx для ошибок сервера), что касается фактического ответа JSON, «библии» нет, но хорошей идеей может быть отправить (снова) статус и данные как 2 разных свойства корневого объекта в успешном ответе (таким образом, вы даете клиенту возможность получить статус из заголовков HTTP и самой полезной нагрузки) и третье свойство, объясняющее ошибка понятным человеку в случае ошибки.
API в Stripe ведет себя аналогично в реальном мире.
т.е.
хорошо
ошибка
источник
Я использую это в моем приложении Express.js:
источник
Стандартный способ получить полный HttpResponse, который включает в себя следующие свойства
На бэкенде сделайте это
На Frontend например , в
Angular
, просто сделать:источник
источник
источник
Вы могли бы сделать это
источник
Лучший способ отправить ответ об ошибке
return res.status(400).send({ message: 'An error has occurred' })
.Затем в вашем интерфейсе вы можете поймать его, используя что-то вроде этого:
Просто регистрация
err
не будет работать, так как объект отправленного сообщения находится вerr.response.data
.Надеюсь, это поможет!
источник