¿Cómo esperar a una consulta MySQL para terminar antes de ejecutar otro servidor de nodo usando?

WILLIAM :

Estoy construyendo un servidor expreso para recibir la solicitud (un diccionario con 10 elementos) de mi Reaccionar parte delantera y luego guardar los datos en la base de datos. A continuación se muestra el código.

He encontrado que la consulta puede bloquearse durante la inserción, por ejemplo, 2 consultas consiguieron el mismo id por LAST_INSERT_ID (). He tratado de usar setTimeout () para envolver la función getConnection pero sigue existiendo el problema. ¿Cómo resolver mejor el problema?

Los datos de la solicitud:

{{.....}, {.....}, {.....}, {.....}, {.....}} #10 item

Código:

router.post('/fruit', (req, res) => {
    const dict = req.body;
    let itemCount = 0;
    var err_list = [];
    Object.keys(dict).forEach(function(r){
        let query = "call sp_insert_fruit();"
        setTimeout(function() {
            getConnection(function(err, conn){
                if (err) {
                    return res.json({ success: false, error: err })
                } else {
                    conn.query(query, function (err, result, fields) {
                        if (err) {
                            err_list.push({'errno':err.errno, 'sql_message':err.sqlMessage});
                        }
                        itemCount ++;
                        if (itemCount === Object.keys(dict).length) {
                            conn.release()
                            console.log('released', err_list)
                            if (err_list .length === 0) {
                                return res.json({ success: true});
                            } else {
                                return res.json({ success: false, error: err_list});
                            }
                        }
                    });
                }
            });
        }, 1000);
    });
});

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
huytc:

Debe reemplazar las devoluciones de llamada con promesas y asíncrono / aguardan a evitar el infierno de devolución de llamada. El uso de promesas, este problema debe ser fácil de resolver.

connection.js

const p = mysql.createPool({
  "connectionLimit" : 100,
  "host": "example.org",
  "user": "test",
  "password": "test",
  "database": "test",
  "multipleStatements": true
});

// wrap p.getConnection with Promise
function getConnection() {
    return new Promise((resolve, reject) => {
        p.getConnection((err, connection) => {
            if (err) reject(err);
            else resolve(connection);
        });
    });
};

module.exports = getConnection;

código enrutador

// wrap conn.query with Promise
function executeQuery(conn, query) {
    return new Promise((resolve, reject) => {
        conn.query(query, (err, result, fields) => {
            if (err) reject(err);
            else resolve({ result, fields });
        });
    });
}

router.post('/fruit', async (req, res) => {
    const dict = req.body;
    const errList = [];
    const query = "call sp_insert_fruit();"

    let conn = null;
    try {
        conn = await getConnection();
    } catch (err) {
        return res.json({
            success: false,
            error: err
        });
    }

    for (const r of Object.keys(dict)) {
        try {
            const { result, fields } = await executeQuery(conn, query);
        } catch (err) {
            errList.push({
                'errno': err.errno,
                'sql_message': err.sqlMessage
            });
        }
    }

    conn.release();
    console.log('released', errList);
    // I don't know what err_imnt is, so I guess it's errList?
    if (errList.length === 0) {
        return res.json({
            success: true
        });
    } else {
        return res.json({
            success: false,
            error: errList
        });
    }
});

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=372921&siteId=1
Recomendado
Clasificación