MYSQLのクエリは、別の使用してノード・サーバを実行する前に終了するのをどのように待機しますか?

WILLIAM:

私は自分のフロントエンドに反応して、データベースにデータを保存からの要求(10の項目と辞書)を受信するためにExpressサーバを構築しています。以下は私のコードです。

私は、挿入中にクラッシュする可能性があり、クエリが2つのクエリをLAST_INSERT_ID()で同じIDを持って、たとえばことがわかりました。私はのgetConnection機能をラップしたsetTimeout()を使用しようとしましたが、問題がまだ存在しています。どのようにより良い問題を解決するには?

リクエストデータ:

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

コード:

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:

あなたがコールバックを置き換える必要があり約束非同期 / のawait避けるコールバック地獄へ。約束を使用して、この問題を解決するのは簡単でなければなりません。

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;

ルータコード

// 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
        });
    }
});

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=372918&siteId=1
おすすめ