You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从MySQL获取数据转为JSON格式时服务器报错问题求助

解决MySQL查询结果JSON序列化循环引用错误

问题原因

  1. 错误操作Query对象而非查询结果:你在controller中直接将connection.query()返回的Query对象做JSON序列化,但这个对象是mysql模块的内部查询实例,包含定时器、上下文引用等循环依赖的属性(比如_timer和_object互相引用),JSON.stringify无法处理这种循环结构,导致报错。
  2. 无效的错误捕获写法: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 07:43:11