【发布时间】:2022-01-29 02:25:42
【问题描述】:
我在我的节点 js 服务器中使用 Sequelize。我以验证错误告终,因为我的代码尝试写入记录两次,而不是创建一次然后更新它,因为它已经在 DB (Postgresql) 中。
这是我在请求运行时使用的流程:
const latitude = req.body.latitude;
var metrics = await models.user_car_metrics.findOne({ where: { user_id: userId, car_id: carId } })
if (metrics) {
metrics.latitude = latitude;
.....
} else {
metrics = models.user_car_metrics.build({
user_id: userId,
car_id: carId,
latitude: latitude
....
});
}
var savedMetrics = await metrics();
return res.status(201).json(savedMetrics);
有时,如果客户端以非常快的速度调用端点两次或更多次,则上述端点会尝试在user_car_metrics 中保存两个新行,使用相同的user_id 和car_id,两者都是桌子上的 FK user 和 car。
我有一个约束:
ALTER TABLE user_car_metrics DROP CONSTRAINT IF EXISTS user_id_car_id_unique, ADD CONSTRAINT user_id_car_id_unique UNIQUE (car_id, user_id);
重点是,给定的user_id 和car_id 对只能有一个条目。
因此,我开始看到验证问题,在查看并添加日志后,我意识到上面的代码在表中添加了重复项(没有约束)。如果存在约束,当上面的代码尝试插入重复记录时,我会收到验证错误。
问题是,我该如何避免这个问题?如何构造代码,使其不会尝试创建重复记录。有没有办法序列化这个?
【问题讨论】:
标签: node.js postgresql sequelize.js