Node.js — Запрос на обновление с несколькими наборами MySQL не обновляется и не выдает ошибки

#mysql #node.js #aws-lambda #amazon-rds #connection-pooling

#mysql #node.js #aws-lambda #amazon-rds #объединение в пул соединений

Вопрос:

Я пытаюсь обновить таблицу и установить несколько значений столбцов, но запрос работает в половине случаев.

Я действительно сбит с толку, потому что я не понимаю, почему, поскольку результаты запроса на обновление указывают, что количество измененных строк равно 1 (как и ожидалось).

Я использую пул соединений для обработки своего соединения, поскольку я нахожусь в бессерверной среде (AWS Lambda RDS).

Сам код таков :

 async function mySQLConnectionPool() {
    await provideConnectionInfo()
    let pool = mysql.createPool({
            connectionLimit: 20,
            host: mySQLHost,
            user: mySQLUser,
            password: mySQLPassword,
            database: mySQLDatabase
        }
    )
    return pool;
}
api.post('/database-manager/gitlab-webhook', async (gitlabRequest, gitlabResponse) => {
    if (connectionPool == null) {
        connectionPool = await mySQLConnectionPool();
    }

    console.log("receiving messages from gitlab webhook")
    await getPipelineIdsAndJobIds();
    for (let index in pipelineAndJobIds) {
        pipelineId = pipelineAndJobIds[index].pipeline_id;
        jobId = pipelineAndJobIds[index].job_id
        if (gitlabRequest.body["object_attributes"].id == pipelineId amp;amp; gitlabRequest.body["object_attributes"].status == 'success') {
            config = {
                method: 'GET',
                url: `https://gitlab.com/api/v4/projects/${PROJECT_ID_CREATE}/jobs/${jobId}/trace`,
                headers: {
                    "PRIVATE-TOKEN": PRIVATE_TOKEN
                }
            }
            //Get Job Logs using Job Id
            await axios(config)
                .then(
                    (getJobLogsRequest) => {
                        let jobLog = JSON.stringify(getJobLogsRequest.data)
                        const regex = new RegExp('.*instance-link = (.*.com:[0-9]{4}).*');
                        ec2InstanceLink = jobLog.match(regex)[1]
                    }
                )
            console.log(`ec2InstanceLink : ${ec2InstanceLink}`)
            connectionPool.getConnection(function (err, connection) {
                    let query = "UPDATE ec2_request SET ?, request_status = 'Finished'  WHERE pipeline_id = ?"
                    connection.query(query, [{instance_link: ec2InstanceLink}, pipelineId], function (err, result) {
                            if (err) {
                                throw err
                                connection.release();
                            } else {
                                connection.release();
                                console.log("EC2 link provided")
                            }
                        }
                    )
                }
            )
        }
    }
})
  

result Результат connection обратного вызова подтверждает измененную строку :

 OkPacket {
  fieldCount: 0,
  affectedRows: 1,
  insertId: 0,
  serverStatus: 34,
  warningCount: 0,
  message: '(Rows matched: 1  Changed: 1  Warnings: 0',
  protocol41: true,
  changedRows: 1
}
  

Если кто-то увидит ошибку в моем коде, я был бы благодарен, потому что эта ошибка сводит меня с ума. Я подумал, что, возможно, один из параметров может быть нулевым, но оказывается, что все они инициализированы.

Заранее большое спасибо.

Комментарии:

1. affectedRows: 1 означает, что строка была обновлена

2. @aRvi да, но в таблице sql это не так

3. проверьте подключение к базе данных, в котором оно обновляется, возможно, вы проверяете неправильную базу данных или среду

4. База данных не меняется, хотя это странная часть. Одна и та же база данных и одна и та же таблица каждый раз, я добавил код ConnectionPool в сообщение.