Как сохранить несколько записей на mysql на express сервере? - PullRequest
1 голос
/ 13 марта 2020

Я создаю express сервер для получения запроса (диктовку из 10 элементов) от моего переднего плана реакции и затем сохраняю данные в базе данных. Ниже мой код. Я обнаружил, что conn.query будет вызывать только запрос последнего элемента, что означает, что один и тот же запрос вызывается 10 раз. Обновлена ​​только 1 запись. Я хочу использовать для l oop, потому что я хочу получить сообщение об ошибке, если какой-либо элемент не был сохранен успешно. Поэтому я не хочу класть все 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

1 Ответ

3 голосов
/ 15 марта 2020

Причина, по которой это происходит, в том, что переменная query нигде не объявлена. Это должно вызвать ошибку в строгом режиме (и вы должны активировать его). Теперь поведение в вашем коде следующее:

  • Поскольку query не объявлено, это неявно глобальная переменная. Это означает, что область действия - это окружающая функция стрелки
  • Поскольку область действия - это окружающая функция стрелки, существует одна переменная query для всех итераций l oop, поэтому каждая итерация переопределяет эту переменную
  • getConnection является асинхронным. Это означает, что вы 10 раз говорите «открыть соединение позже», и когда соединения открыты, l oop уже закончился. Каждый обратный вызов getConnection может затем обращаться к единственной переменной query, которая содержит последний запрос.

Короче говоря, чтобы исправить код, объявите query как let query, чтобы он ограничен l oop, и каждая итерация l oop имеет свою собственную переменную query. Кроме того, предпочитайте использовать строгий режим, чтобы выдавать явные ошибки, когда код грязный, и тратить меньше времени на подобные проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...