从MySQL获取数据转为JSON格式时服务器报错问题求助
解决MySQL查询结果JSON序列化循环引用错误
问题原因
- 错误操作Query对象而非查询结果:你在controller中直接将
connection.query()返回的Query对象做JSON序列化,但这个对象是mysql模块的内部查询实例,包含定时器、上下文引用等循环依赖的属性(比如_timer和_object互相引用),JSON.stringify无法处理这种循环结构,导致报错。 - 无效的错误捕获写法:
res.json()返回的不是Promise,不能通过.catch()链式捕获错误,原代码里的错误处理逻辑不会生效。
解决方案
核心是通过connection.query()的回调函数获取真正的数据库查询结果(学生数据),而非直接操作Query对象,并在回调内完成错误处理和响应返回。
修改后的Controller代码
const { connection } = require('../../dbConected') module.exports = { getallstudents: (req, res) => { // 传入回调函数获取查询结果与错误信息 connection.query("SELECT * FROM student", (err, result) => { // 处理查询错误 if (err) { return res.status(500).json({ error: err.message }) } // 返回正确的查询结果 res.status(200).json({ students: result }) }) } }
可选:Promise/async-await写法
如果习惯使用异步语法,可将connection.query封装为Promise:
const { connection } = require('../../dbConected') // 封装query为Promise const queryPromise = (sql) => { return new Promise((resolve, reject) => { connection.query(sql, (err, result) => { if (err) reject(err) else resolve(result) }) }) } module.exports = { getallstudents: async (req, res) => { try { const result = await queryPromise("SELECT * FROM student") res.status(200).json({ students: result }) } catch (err) { res.status(500).json({ error: err.message }) } } }
其他代码说明
你的数据库连接代码(dbConected.js)和路由代码(routes.js)无需修改,保持原样即可。
验证效果
修改后重新发起请求,即可正常返回学生数据的JSON格式响应,循环引用报错会消失。
内容的提问来源于stack exchange,提问作者dym111
相关产品推荐
相关产品推荐

