Я занимаюсь разработкой 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()
вызывается, но на втором иследующие запросы, это не так.
Спасибо за помощь