Отправка POST-запроса в Postman, настроенном на отправку определенного статуса, отправляет статус по умолчанию - PullRequest
0 голосов
/ 06 апреля 2020

Я хочу, чтобы мой запрос POST отправлял HTTP 409 в определенном случае, поэтому это код:

res.status(409).send();

Однако, когда я настраиваю запрос в Postman, он показывает результат 200 OK. Я вставил несколько логов в код, и я уверен, что вышеприведенная строка нажата.

Что не так?

ОБНОВЛЕНИЕ:

Вот полный метод:

app.post('/orders/:order_id/sync_status', (req, res) => {
    order.findOne({ order_id: req.params.order_id},
        function(err, results) {
            if (err) {
                res.send(`error: ${error}`);
            } else if (!results) {
                res.send(`no order with order_id: ${req.params.order_id}`);
            } else {
                status.findOne({ order_id: req.params.order_id},
                    function(err, result) {
                        if (err) {
                            res.send(`error: ${error}`);
                        } else if (result) {
                            res.status(409).send();
                        } else {
                            const newStatus = new status (req.body);
                            newStatus.save();
                        }
                    });
            }
            res.end();
        });
});

и запрос почтальона:

enter image description here

1 Ответ

1 голос
/ 06 апреля 2020

Простая причина в том, что у вас есть res.end()

Более длинный ответ заключается в том, что res.end() выполняется до того, как этот фрагмент

status.findOne({order_id: req.params.order_id}, function(err, result) {
  if (err) {
    res.send(`error: ${error}`);
  } else if (result) {
    res.status(409).send();
  } else {
    const newStatus = new status(req.body);
    newStatus.save();
  }
});

был выполнен из-за асинхронного вызова / обратного вызова.

Без тестирования ваш окончательный код должен выглядеть следующим образом

app.post('/orders/:order_id/sync_status', (req, res) => {
  order.findOne({order_id: req.params.order_id}, function(err, results) {
    if (err) {
      return res.send(`error: ${error}`);
    }

    if (!results) {
      return res.send(`no order with order_id: ${req.params.order_id}`);
    }

    status.findOne({order_id: req.params.order_id}, function(err, result) {
      if (err) {
        return res.send(`error: ${error}`);
      }

      if (result) {
        return res.status(409).send();
      }

      const newStatus = new status(req.body);
      newStatus.save();
      return res.end();
    });
  });
});

...