Обещание разрешается только по первому запросу - PullRequest
0 голосов
/ 13 декабря 2018

Я занимаюсь разработкой API для создания структуры склада.Поскольку мы используем микросервисную архитектуру, мне нужно отправить запрос через rabbitmq в другой микросервис, чтобы сгенерировать адрес для нового хранилища.

Поэтому я использую функцию потребления ampq , заключенную в функцию, которая возвращает обещание.Когда я впервые достигаю конечной точки, обещание будет выполнено, и я смогу продолжить с моими данными.Но во втором запросе обещание не будет выполнено.

Может быть, по очевидной причине, но сейчас я не понимаю.

Так вот мой код:

rout.js

router.post('/', (req, res) => {
  ... 
  const validate = ajv.compile(warehoseSchema);
  const valid = validate(req.body);
  if (valid) {
    sendToQueue('addressMgmt', req.body.address);
    consume()
      .then((result) => {
        const {
          id_address: idAddress,
          license_plate: licensePlate,
          town,
        } = result.body;
        createWarehouseHandler(
          customernumber, req.body, idAddress, licensePlate, town,
        )
          .then((insertId) => {
            res.json({
              id: 'warehouses02',
              message: `Warehouse with id ${insertId} successfully created`,
            });
          })
          .catch((err) => {
            res.status(err.status).json({
              id: err.id,
              message: err.message || err.sqlMessage,
            });
          });
      }).catch((err) => {
        res.status(err.status).json({
          id: err.id,
          message: err.message || err.sqlMessage,
        });
      });
  } else {
    res.status(417).json({
      id: 'warehouses01',
      message: `Invalid JSON: ${ajv.errorsText(validate.errors)}`,
    });
  }
});

const consume = () => new Promise((resolve, reject) => {
  const q = 'warehouseMgmt';
  amqpCh.consume(q, (msg) => {
    const message = JSON.parse(msg.content.toString());
    if (Object.keys(message).includes('body')) {
      resolve(message);
    } else {
      const err = new Error();
      err.status = 500;
      err.id = 'rabbit01';
      err.message = 'No message was cosumed';
      reject(err);
    }
  }, { noAck: true });
});

При первом запросе consume().then() вызывается, но на втором иследующие запросы, это не так.

Спасибо за помощь

...