API持续加载无响应故障:昨日正常今日无法获取数据库数据
问题描述
昨日API可正常运行,能将数据库信息以JSON格式返回。今日测试查询时页面无限加载,无任何结果返回,VSC和浏览器控制台均无报错。已尝试更换端口、重启应用,相关代码如下:
const dbapp = require('mysql'); const express = require('express'); const cors = require('cors'); const app = express(); app.use(cors); const database = dbapp.createConnection({ host: 'localhost', user: 'root', password: '', database: 'bws_os' }); app.get('/v1/produktdetails', (re, res) =>{ const sql = "Select * from produktdetails" database.query(sql, (err, data) =>{ if(err) return res.json(err); return res.json(data); }) }); app.get('/v1/produktdetails/:id',(re, res) =>{ const sql = "Select * from produktattribute WHERE ProduktID=:id" database.query(sql, (err, data) =>{ if(err) return res.json(err); return res.json(data); }) }); app.listen(5137, ()=>{ console.log('Listening'); })
问题排查与修复
- CORS中间件调用错误:
app.use(cors)必须写成app.use(cors()),因为cors是函数,需要调用后返回中间件实例,不调用的话请求会被挂起,导致无限加载。 - SQL参数绑定错误:
mysql模块不支持:id这种命名占位符,得用?作为占位符,并且在query方法里传入参数数组,否则SQL无法正确执行,请求会卡在数据库查询环节。 - 未监听数据库连接错误:当前代码没处理数据库连接失败的情况,一旦数据库连不上,请求会无响应且不报错,得加上连接错误监听。
- 请求对象命名不规范:路由里的
re建议改成req,虽然不影响功能,但统一命名更易维护。
修复后的完整代码
const dbapp = require('mysql'); const express = require('express'); const cors = require('cors'); const app = express(); // 修复CORS中间件调用 app.use(cors()); const database = dbapp.createConnection({ host: 'localhost', user: 'root', password: '', database: 'bws_os' }); // 添加数据库连接错误监听 database.on('error', (err) => { console.error('数据库连接出错:', err); }); // 连接数据库并打印状态 database.connect((err) => { if (err) { console.error('数据库连接失败:', err); return; } console.log('已成功连接到数据库'); }); // 修复请求对象命名为req app.get('/v1/produktdetails', (req, res) =>{ const sql = "Select * from produktdetails"; database.query(sql, (err, data) =>{ if(err) { console.error('查询produktdetails出错:', err); return res.status(500).json(err); } return res.json(data); }) }); // 修复SQL参数绑定方式 app.get('/v1/produktdetails/:id',(req, res) =>{ const sql = "Select * from produktattribute WHERE ProduktID=?"; // 传入参数数组,防止SQL注入 database.query(sql, [req.params.id], (err, data) =>{ if(err) { console.error('查询produktattribute出错:', err); return res.status(500).json(err); } return res.json(data); }) }); app.listen(5137, ()=>{ console.log('服务已启动,监听端口5137'); })
额外排查建议
- 先确认MySQL服务是否正常运行:打开MySQL客户端,手动连接数据库并执行查询语句,看是否能正常返回数据。
- 测试接口时先测不带参数的
/v1/produktdetails,确认基础查询没问题后再测带参数的接口。 - 查看Node.js控制台日志:修复后运行代码,控制台会打印连接状态和错误信息,方便定位问题。
内容的提问来源于stack exchange,提问作者Senar
相关产品推荐
相关产品推荐

