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

Next.js(v14)生产环境MySQL查询报错求助:本地正常仅线上异常

问题排查与解决方案

1. 先捕获具体错误,定位根源

生产环境的500错误过于笼统,先给API路由添加错误捕获逻辑,获取具体报错信息(可临时在生产环境开启,或查看服务器日志):

import { NextResponse } from 'next/server';
import { connectDB, queryDB, disconnectDB } from '@/path/to/your/db-utils'; // 替换为你的实际文件路径

export async function GET() {
  try {
    await connectDB();
    const query = `SELECT * FROM Events`;
    const results = await queryDB(query);
    await disconnectDB();

    return NextResponse.json({ results });
  } catch (error) {
    // 临时返回错误详情,上线后可改为统一提示
    return NextResponse.json({ error: error.message || '数据库查询失败' }, { status: 500 });
  }
}

重新部署后调用API,就能看到具体的错误原因,比如连接实例失效、网络权限问题等。

2. 替换单连接为连接池,修复核心问题

你当前用createConnection创建的是单个数据库连接,每次请求调用connect和end会直接销毁该连接。后续请求复用已被销毁的连接实例时就会报错——这正是本地正常但生产环境出问题的核心原因(本地请求量小,暂未触发连接复用冲突)。

修改数据库工具代码为连接池模式:

import mysql from 'mysql2/promise'; // 使用promise版本更适配async/await语法

// 创建连接池,自动管理连接的创建、复用与销毁
const pool = mysql.createPool({
  host: process.env.DB_HOST,
  port: 25060,
  user: process.env.DB_USER,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_DATABASE,
  waitForConnections: true,
  connectionLimit: 10, // 可根据服务器配置调整
  queueLimit: 0
});

// 直接从连接池拿连接执行查询,无需手动管理连接生命周期
export const queryDB = async (queryStr, values = []) => {
  const [rows] = await pool.execute(queryStr, values); // 用execute更安全,可防范SQL注入
  return rows;
};

// 可选:应用关闭时关闭连接池
export const closePool = async () => {
  await pool.end();
};

同步修改API路由,移除多余的连接开启/关闭逻辑:

import { NextResponse } from 'next/server';
import { queryDB } from '@/path/to/your/db-utils';

export async function GET() {
  try {
    const query = `SELECT * FROM Events`;
    const results = await queryDB(query);
    return NextResponse.json({ results });
  } catch (error) {
    console.error('数据库错误详情:', error); // 服务器日志中查看完整错误
    return NextResponse.json({ error: '服务器内部错误' }, { status: 500 });
  }
}

3. 额外检查点

  • 确认DigitalOcean防火墙规则,允许应用服务器访问数据库的25060端口(本地能连接不代表生产服务器网络策略放行)
  • 检查数据库用户权限,是否允许从应用服务器的IP地址发起连接(部分数据库会限制连接来源IP)
  • 验证生产环境环境变量是否正确加载(可在API路由中临时打印process.env.DB_HOST等变量值确认)

内容的提问来源于stack exchange,提问作者CSS-Romeo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 09:47:35