【发布时间】:2022-01-12 21:34:29
【问题描述】:
我从 webhook 收到 n 个 post 请求(在每个 webhook 触发器上)。来自同一触发器的所有请求的数据都是相同的——它们都具有相同的“orderId”。我有兴趣只保存其中一个请求,因此在每个端点命中时,我都会检查这个特定的 orderId 是否作为我的数据库中的一行存在,否则 - 创建它。
if (await orderIdExists === null) {
await Order.create(
{
userId,
status: PENDING,
price,
...
}
);
await sleep(3000)
function sleep(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
}
return res.status(HttpStatus.OK).send({success: true})
} catch (error) {
return res.status(HttpStatus.INTERNAL_SERVER_ERROR).send({success: false})
}
}
else {
return res.status(HttpStatus.UNAUTHORIZED).send(responseBuilder(false, responseErrorCodes.INVALID_API_KEY, {}, req.t));
}
}
问题是在 Sequelize 设法将新创建的订单保存在数据库中之前(所有 n 个 post 请求都在 1 秒内到达终点 - 或更短),我已经从其他 n 个 post 请求中获得了另一个端点命中,而orderIdExists 仍然等于 null,因此它最终会创建更多相同的订单。一个(不是很好的解决方案)是使 orderId 在数据库中唯一,这可以防止创建具有相同 orderId 的订单,但无论如何都会尝试,这会导致数据库中的空 id 递增。任何想法将不胜感激。 p.s.如您所见,我尝试添加“睡眠”功能无济于事。
【问题讨论】:
标签: node.js express sequelize.js