如何使用Sequelize查询最新记录并更新列,解决latestRecord为undefined问题
问题根因
两段代码的核心错误都是没有给异步查询方法加await关键字:
Sequelize的findAll()是异步方法,返回的是Promise对象,不是直接返回查询结果数组,不加await的情况下latestRecord是pending状态的Promise,自然无法通过下标获取属性,触发undefined报错。
原有代码其他可优化点
- 查询单条最新记录不用
findAll()加limit 1,直接用findOne()更合适,返回的直接是单条记录对象,不需要取下标 - 排序的写法可以不用
Sequelize.literal,Sequelize原生支持数组格式的排序参数,更规范也避免SQL注入风险 - 查询后需要加空判断,避免表内无数据的情况下再次触发undefined报错
修正后的可运行代码
app.put("/service/activeStatus", async (req, res) => { try { const activeStatus = req.body.status; // 加await,用findOne直接查询最新记录 const latestRecord = await NominationSessionModel.findOne({ order: [['nominationStartDate', 'DESC']] }); // 空值判断避免表无数据时报错 if (!latestRecord) { return res.status(404).json({fail: "未找到可更新的提名会话记录"}); } const updateSession = await NominationSessionModel.update( { ...req.body, status: activeStatus }, { where: { id: latestRecord.id } } ); res.status(200).send(updateSession); } catch (e) { res.status(500).json({fail: e.message}); } });
补充说明
如果你需要确认MAX日期的写法是否可行,修正后的写法如下,同样需要加await,且使用聚合函数查询的时候需要加raw: true避免实例包装,同时要注意聚合查询返回的结果结构和普通查询不同:
// 聚合查询写法(不推荐,不如findOne排序方便) const latestRecord = await NominationSessionModel.findOne({ attributes: [ [sequelize.fn('MAX', sequelize.col('nominationStartDate')), 'maxDate'], 'id', 'status' ], raw: true });
内容的提问来源于stack exchange,提问作者soccerway
相关产品推荐
相关产品推荐

