Sequelize多对多关联查询时服务端不返回响应如何解决?
问题根因与修复方案
你遇到的是Express接口请求挂起的典型问题,核心原因及修复方法如下:
根因说明
- 控制器方法未接收Express传入的
req、res参数,也没有调用响应方法将数据返回给前端,导致请求一直处于待响应状态,直到超时。 - 异常场景没有返回错误响应,同样会导致请求挂起。
- Sequelize默认返回的是模型实例对象,而非普通JS对象,直接返回可能出现序列化异常。
修复代码
1. 修正filmController的findAll方法
//查询所有包含关联演员的影片 exports.findAll = (req, res) => { return Film.findAll({ include: [ { model: Actor, as: "actors", attributes: ["first_name", "last_name"], through: { attributes: [], } }, ], // 配置直接返回普通嵌套对象,无需手动转换 raw: true, nest: true }) .then((films) => { console.log(films[5]); // 核心:调用res.json把结果返回给前端 res.json(films); }) .catch((err) => { console.log(">> 检索影片数据出错: ", err); // 错误场景也返回响应,避免请求挂起 res.status(500).json({message: "检索影片数据出错", error: err.message}); }); };
2. 修正filmController的findById方法
// 根据影片ID查询单条影片数据 exports.findById = (req, res) => { const film_id = req.params.id; return Film.findByPk(film_id, { include: [ { model: Actor, as: "actors", attributes: ["first_name", "last_name"], through: { attributes: [], } }, ], }) .then((film) => { if (!film) { return res.status(404).json({message: "未找到对应影片"}); } // 转换模型实例为普通对象后返回 res.json(film.get({ plain: true })); }) .catch((err) => { console.log(">> 查询影片数据出错: ", err); res.status(500).json({message: "查询影片数据出错", error: err.message}); }); };
内容的提问来源于stack exchange,提问作者Sanjana Ekanayake
相关产品推荐
相关产品推荐

