Next.js MySQL插入API报错:循环结构转JSON问题求助
问题排查与解决
错误原因
- 循环引用来源:调用
conn.query执行INSERT后返回的rows对象,包含MySQL驱动内部的Query、Timer等实例,这些对象间存在循环引用(比如Timer的_object指向Query,Query的_timer指向Timer),直接序列化会触发JSON转换错误。 - 冗余的JSON序列化:
res.json()方法本身会自动将传入的JavaScript对象转为JSON字符串,你手动调用JSON.stringify(rows)后再传给res.json(),相当于把JSON字符串再次序列化,这是多余操作,反而放大了问题。
修复方案
不要直接返回驱动返回的完整结果对象,只提取业务需要的关键数据(比如插入的用户ID、受影响行数),同时去掉多余的JSON.stringify调用:
修改后的代码
import type { NextApiRequest, NextApiResponse } from "next"; import * as pool from "../../../src/utils/dbConnection"; import console from "console"; import util from "util"; // 可选,用于调试打印结果结构 export default async (req: NextApiRequest, res: NextApiResponse) => { const { email, password, firstname, lastname } = req.body as any; let conn; try { conn = await pool.getConnection(); const result = await conn.query( `INSERT INTO Users(email, password, firstname, lastname) VALUES(?, ?, ?, ?)`, [email, password, firstname, lastname] ); // 调试用:打印结果的完整结构(避免循环引用问题) // console.log(util.inspect(result, { depth: null })); // 只返回业务需要的关键数据 res.status(200).json({ insertId: result.insertId, // 插入记录的自增ID affectedRows: result.affectedRows, // 受影响的行数 message: "用户创建成功" }); } catch (err) { console.log(err); // 返回友好的错误信息 res.status(500).json({ message: "插入数据失败", error: err instanceof Error ? err.message : String(err) }); } finally { if (conn) conn.end(); } };
额外提示
- 如果需要调试查看
result的完整结构,不要用JSON.stringify,而是用Node.js的util.inspect方法(需引入util模块),它能处理循环引用并打印对象的完整层级。 - 确保数据库连接池配置正确,
conn.end()操作能正常释放连接,避免连接泄漏。
内容的提问来源于stack exchange,提问作者Blake Lucey
相关产品推荐
相关产品推荐

