如何让Node.js HTTP服务器返回异步SQL查询结果供前端AJAX调用
解决方案
核心问题说明
你当前的实现思路存在三个核心问题:
- 依赖全局变量存储异步执行结果:异步数据库查询不会阻塞主线程执行,调用
getdb()后立刻读取全局变量DBresult,大概率还是null,此时查询请求还未从数据库返回。 - 单次查询后直接关闭数据库连接:你的代码在
finally逻辑中调用了con.end(),第一次查询完成后数据库连接就会被释放,后续所有查询请求都会直接报错。 - 启动时仅查询一次数据:如果需要获取SQL服务器中的最新数据,应该在每次收到前端请求时执行查询,也可以自行添加缓存更新逻辑减少数据库压力。
改造后完整代码
const util = require('util'); const http = require('http'); const mysql = require('mysql'); // 使用连接池管理数据库连接,无需手动开关连接,性能更稳定 const pool = mysql.createPool({ host: "XXXXX", user: "XXXXX", password: "XXXXX", database: "XXX" }); const query = util.promisify(pool.query).bind(pool); // 改造为返回Promise的异步函数,直接返回查询结果,不依赖全局变量 async function getDbData() { return await query('SELECT * FROM mylist'); } // 启动HTTP服务 http.createServer(async function (req, res) { // 添加CORS头,解决本地测试时前端AJAX跨域问题 res.writeHead(200, { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*' }); try { // 每次收到请求时查询数据库,拿到结果后返回 const data = await getDbData(); res.write(JSON.stringify(data)); } catch (err) { // 错误处理,返回报错信息 res.write(JSON.stringify({ code: 500, msg: '数据库查询失败', error: err.message })); } res.end(); }).listen(8080);
前端AJAX调用示例
你可以在HTML页面中使用以下代码获取接口返回的SQL数据:
// 原生fetch调用示例 fetch('http://你的服务器IP:8080') .then(res => res.json()) .then(data => { // 这里拿到的data就是数据库查询的数组结果,直接更新到HTML页面即可 console.log(data); }) .catch(err => console.error('请求失败', err));
内容的提问来源于stack exchange,提问作者L0val
相关产品推荐
相关产品推荐

