Подтвердить что ты не робот

Правильный способ установки статуса ответа и содержимого JSON в REST API, созданный с помощью nodejs и выражения

Я играю с Nodejs и выражаю, создавая небольшой API для отдыха. Мой вопрос: какова хорошая практика/лучший способ установить статус кода, а также данные ответа?

Позвольте мне пояснить немного кода (я не буду размещать node и выражать код, необходимый для запуска сервера, а также только методы маршрутизатора):

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];
  }
};

Код ниже работает отлично, и при отправке запроса в Postman я получаю следующий результат: enter image description here

Как вы можете видеть, статус показывает 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.

Ресурсы/советы, чтобы узнать больше об этой теме, более чем приветствуются.

4b9b3361

Ответ 1

Экспресс API ссылка охватывает этот случай.

Смотри статус и отправляй.

Короче говоря, вам просто нужно вызвать метод status перед вызовом json или send:

res.status(500).send({ error: "boo:(" });

Ответ 2

Вы можете сделать это следующим образом:

res.status(400).json(json_response);

Это установит код состояния HTTP на 400, он работает даже в express 4.

Ответ 3

статус 200 будет использоваться по умолчанию при использовании res.send, res.json и т.д.

Вы можете установить статус как res.status(500).json({ error: 'something is wrong' });

Часто я буду делать что-то вроде...

router.get('/something', function(req, res, next) {
  // Some stuff here
  if(err) {
    res.status(500);
    return next(err);
  }
  // More stuff here
});

Затем попросите мое промежуточное программное обеспечение отправить ответ и сделать что-нибудь еще, что мне нужно сделать, когда есть ошибка.

Дополнительно: res.sendStatus(status) добавлено с версии 4.9.0 http://expressjs.com/4x/api.html#res.sendStatus

Ответ 4

Список кодов состояния HTTP

Хорошая практика в отношении ответа о состоянии состоит в том, чтобы, как и ожидалось, отправлять правильный код состояния HTTP в зависимости от ошибки (4xx для ошибок клиента, 5xx для ошибок сервера), что касается фактического ответа JSON, то нет "библии", но хорошей идеей может быть отправить (снова) статус и данные как 2 различных свойства корневого объекта в успешном ответе (таким образом, вы даете клиенту возможность получить статус из заголовков HTTP и самой полезной нагрузки) и третье свойство, объясняющее ошибка понятным человеку в случае ошибки.

API в Stripe ведет себя аналогично в реальном мире.

т.е.

Хорошо

200, {status: 200, data: [...]}

ошибка

400, {status: 400, data: null, message: "You must send foo and bar to baz..."}

Ответ 5

Я использую это в своем приложении Express.js:

app.get('/', function (req, res) {
    res.status(200).json({
        message: 'Welcome to the project-name api'
    });
});

Ответ 6

res.status(500).jsonp(dataRes);

Ответ 7

Стандартный способ получить полный HttpResponse, который включает следующие свойства

  1. тело//содержит ваши данные
  2. заголовки
  3. оК
  4. статус
  5. его статустип
  6. URL

На бэкенде сделайте это

router.post('/signup', (req, res, next) => {
    // res object have its own statusMessage property so utilize this
    res.statusText = 'Your have signed-up succesfully'
    return res.status(200).send('You are doing a great job')
})

если вы хотите получить, например, в приложении Angular просто выполните:

let url = 'http://example.com/signup'
this.http.post(url, { profile: data }, {
    observe: 'response' // remember to add this, you'll get pure HttpResponse
}).subscribe(response => {
    console.log(response)
})

Ответ 8

try {
  var data = {foo: "bar"};
  res.json(JSON.stringify(data));
}
catch (e) {
  res.status(500).json(JSON.stringify(e));
}