mysql - 如何通过快递服务器将多条记录保存到mysql?
问题描述
我正在构建一个快速服务器来接收来自我的反应前端的请求(一个包含 10 个项目的字典),然后将数据保存到数据库中。下面是我的代码。我发现它conn.query
只会调用最后一项的查询,这意味着同一个查询被调用了 10 次。仅更新了 1 条记录。我想使用 for 循环是因为如果任何项目未成功保存,我想获取 err msg。所以我不想把所有 10 个项目放在一个UPDATE query
. 我怎么解决这个问题?
The request data:
{{.....}, {.....}, {.....}, {.....}, {.....}} #10 item
Code:
router.post('/fruit', (req, res) => {
var err_list = [];
for (let r in req.body) {
#for-loop here is used to put each r into query
query = "UPDATE ........."
console.log(query) #output 10 queries with different params
getConnection(function(err, conn){
if (err) {
return res.json({ success: false, error: err })
} else {
conn.query(query, function (err, result, fields) {
conn.release()
console.log(query, err) #output 10 same queries
if (err) {
err_list.push(err);
}
});
}
})
}
if (err_list.length === 0){
return res.json({ success: true });
} else {
return res.json({ success: false, data: err_list });
}
});
connection.js:
const p = mysql.createPool({
"connectionLimit" : 100,
"host": "example.org",
"user": "test",
"password": "test",
"database": "test",
"multipleStatements": true
});
const getConnection = function(callback) {
p.getConnection(function(err, connection) {
callback(err, connection)
})
};
module.exports = getConnection
解决方案
发生这种情况的原因是query
变量没有在任何地方声明。这应该会导致严格模式下的错误(并且您应该激活它)。现在您的代码中的行为如下:
- 由于
query
未声明,因此它隐含地是一个全局变量。 - 与
query
全局一样,它在每次迭代时都会重新分配 getConnection
是异步的。这意味着您要告诉 10 次“稍后打开连接”,当连接打开时,循环已经结束。然后,每个getConnection
回调都可以访问query
包含最后一个查询的单个变量。
简而言之,为了修复代码,声明query
为let query
使其作用于循环,并且每个循环迭代都有自己的query
变量。此外,更喜欢使用严格模式,以便在代码脏时抛出显式错误,并减少处理此类问题的时间。
推荐阅读
- vue.js - 在移动视图中依次显示 Bootstrap Vue 列
- java - org.springframework.amqp.AmqpException:找不到类 java.util.LinkedHashMap 的方法
- ruby-on-rails - 具有不同类型的模型 has_many 的多态关联
- angular - 在实现路由器导航事件的 Angular (8.3) 服务的 NavigationURL 调用期间单元测试失败
- c# - 从另一个源 url 获取执行的 url
- javascript - 在cordova和python服务器之间进行通信
- python - Collatz 来自自动化无聊的东西
- postgresql - 如何使用 Anorm 将 JSON 插入到 postgres 表中?
- vb.net - 仅将鼠标悬停在数据网格上时出现奇怪的错误
- python - 如何处理数据帧中的余弦相似度结果?