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
相关产品推荐
相关产品推荐

