NodeJS中Post请求后返回SQL数据未更新问题排查
问题:Post请求返回的数据未包含刚插入的新记录,但后续Get请求能获取最新内容
你遇到的问题核心是Promise的.then()用法错误,导致查询操作在插入操作完成前就执行了,所以返回的是旧数据。咱们一步步拆解:
问题出在哪?
看你Post路由里的这段代码:
InsertIntoTable(req.body).then(connectToDB().then(result => res.end(result)));
这里的关键错误是:.then()方法需要接收一个函数作为回调,但你直接执行了connectToDB().then(...)——这意味着connectToDB()会在InsertIntoTable的Promise还没resolve(也就是插入操作还没完成)的时候就立刻跑起来了。相当于插入和查询是并行执行的,查询自然拿不到刚插入的数据。
而后续的Get请求是单独发起的,这时候插入操作已经完成,所以能拿到最新数据。
怎么修复?
把查询操作包装成一个函数,传给.then(),这样只有当插入操作的Promise resolve后,才会执行查询:
app.post('/', function (req, res) { res.writeHead(200, {'Content-Type': 'text/html'}); console.log(req.body); InsertIntoTable(req.body) // 等插入完成后,再调用查询函数 .then(() => connectToDB()) // 拿到查询结果后返回给客户端 .then(result => res.end(result)) // 别忘了加错误处理,避免服务器崩溃 .catch(err => { console.error('操作失败:', err); res.status(500).end('数据操作失败,请重试'); }); })
额外的优化建议(避免踩更多坑)
- 数据库连接优化:你现在每次调用函数都创建新连接,而且
con.release少了括号(应该是con.release()),更合理的做法是使用连接池,避免频繁创建/销毁连接的开销:
// 初始化连接池(放在代码最顶部) const pool = mysql.createPool({ host: "localhost", user: "root", password: "*****", database: "heroes" }); // 修改connectToDB函数 function connectToDB() { return new Promise((resolve, reject) => { pool.getConnection((err, con) => { if (err) return reject(err); con.query("SELECT id, name FROM heroes", (err, result) => { con.release(); // 释放连接回池 if (err) return reject(err); resolve(JSON.stringify(result)); }); }); }); } // InsertIntoTable也同理修改,用连接池获取连接 function InsertIntoTable(obj) { return new Promise((resolve, reject) => { pool.getConnection((err, con) => { if (err) return reject(err); // 用参数化查询避免SQL注入! con.query("INSERT INTO heroes (id,name) VALUES (?, ?)", [obj.id, obj.name], (err, result) => { con.release(); if (err) reject(err); else resolve(JSON.stringify(result)); }); }); }); }
避免SQL注入:你原来的插入语句是直接拼接参数的,比如
"INSERT INTO heroes (id,name) VALUES ("+obj.id+",'"+obj.name+"')",这很容易被恶意用户利用进行SQL注入攻击。上面的代码已经改成了参数化查询(用?占位,参数放在数组里),这是更安全的做法。错误处理完善:原来的
connectToDB里用了if (err) throw err;,但在Promise内部应该用myReject(err),否则可能导致未捕获的Promise错误。加上.catch()可以优雅处理插入或查询过程中的错误,避免服务器崩溃。
这样修改后,Post请求就能正确返回包含新插入数据的结果了!
内容的提问来源于stack exchange,提问作者RT.
相关产品推荐
相关产品推荐

