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

Next.js MySQL插入API报错:循环结构转JSON问题求助

问题排查与解决

错误原因

  1. 循环引用来源:调用conn.query执行INSERT后返回的rows对象,包含MySQL驱动内部的Query、Timer等实例,这些对象间存在循环引用(比如Timer的_object指向Query,Query的_timer指向Timer),直接序列化会触发JSON转换错误。
  2. 冗余的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 22:18:26