首页 > 解决方案 > 如何通过快递服务器将多条记录保存到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

标签: mysqlnode.jsapiexpressrequest

解决方案


发生这种情况的原因是query变量没有在任何地方声明。这应该会导致严格模式下的错误(并且您应该激活它)。现在您的代码中的行为如下:

  • 由于query未声明,因此它隐含地是一个全局变量。
  • query全局一样,它在每次迭代时都会重新分配
  • getConnection是异步的。这意味着您要告诉 10 次“稍后打开连接”,当连接打开时,循环已经结束。然后,每个getConnection回调都可以访问query包含最后一个查询的单个变量。

简而言之,为了修复代码,声明querylet query使其作用于循环,并且每个循环迭代都有自己的query变量。此外,更喜欢使用严格模式,以便在代码脏时抛出显式错误,并减少处理此类问题的时间。


推荐阅读