承诺仅在第一个请求时解决

时间:2018-12-13 09:41:40

标签: node.js express promise

我正在开发API以创建仓库结构。因为我们使用的是微服务架构,所以我需要通过 rabbitmq 向另一个微服务发出请求,以生成新仓库的地址。

因此,我使用包装在返回承诺的函数中的 ampq 消费函数。当我第一次碰到端点时,诺言就被解决了,我可以继续处理我的数据。但是在第二个请求中,承诺将无法解决。

也许这是出于明显的原因,但目前我不明白。

这是我的代码:

routes.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()上被调用,但是在第二个及其后的请求上没有被调用。

感谢您的帮助

0 个答案:

没有答案