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

express+node+react+mysql项目刷新页面接口报错如何修复?

问题根源
  • 你使用的node-mysql库的所有数据库操作都是异步执行的,你当前的代码同步按顺序调用connection.connect()、connection.query()、connection.end(),不等query的回调执行就已经关闭了数据库连接,第一次请求可能凑巧时序契合正常返回,第二次请求时复用的全局连接实例已经被销毁,触发PROTOCOL_ENQUEUE_AFTER_QUIT错误。
  • 接口抛出500错误后返回的是文本格式的报错信息,前端代码调用res.json()解析非JSON内容就会抛出JSON解析失败错误。
修复方案

方案1:调整现有连接逻辑(临时修复)

将关闭连接的操作移到query的回调内部,确保查询执行完成后再关闭连接,同时错误返回也统一用JSON格式:

// express/users.js 修正后代码
var express = require('express');
var router = express.Router();

const connection = require('./MySQL.js')

/* GET users listing. */
router.get('/', function(req, res, next) {
  connection.connect()

  connection.query("SELECT * FROM Users;", (err, rows) => {
    // 查询完成后再关闭连接
    connection.end()
    if(err) {
      return res.status(500).json({error: err.message})
    } 
    console.log(rows)
    res.json(rows)
  })
});

module.exports = router;

方案2:使用数据库连接池(生产环境推荐)

单连接复用容易出现连接断开、并发请求冲突的问题,更推荐使用连接池管理数据库连接:
首先修改你的MySQL.js文件,导出连接池实例:

// MySQL.js 修正后代码
const mysql = require('mysql')
const pool = mysql.createPool({
  host: '你的数据库host',
  user: '你的数据库用户名',
  password: '你的数据库密码',
  database: '你的数据库名称',
  connectionLimit: 10 // 最大连接数按需调整
})
module.exports = pool

再修改users.js的逻辑,直接用连接池执行查询:

// express/users.js 修正后代码
var express = require('express');
var router = express.Router();

const pool = require('./MySQL.js')

/* GET users listing. */
router.get('/', function(req, res, next) {
  // 连接池会自动管理连接的获取和释放,无需手动connect和end
  pool.query("SELECT * FROM Users;", (err, rows) => {
    if(err) {
      return res.status(500).json({error: err.message})
    } 
    res.json(rows)
  })
});

module.exports = router;

前端代码无需额外修改,接口返回正确JSON格式后即可正常解析渲染。

内容的提问来源于stack exchange,提问作者RA M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 10:33:01