Как закрыть соединение MySQL после многократного обещания? - PullRequest
0 голосов
/ 02 апреля 2019

Я должен использовать несколько запросов SQL.Поэтому я создаю Обещание, чтобы сделать это.Но мне нужно использовать это обещание в том же обещании.Когда я пытаюсь остановить соединение SQL с помощью «connection.end ()», у меня в консоли появляется эта ошибка:
Ошибка: невозможно поставить запрос в очередь после вызова quit.

ЕслиЯ не пишу "connection.end ()", мой код работает.

function requete( sql ) {
    return new Promise( ( resolve, reject ) => {
        this.connection.query( sql, ( err, rows ) => {
            if ( err )
                return reject( err );
            resolve( rows );
        } );
    } );
}

myRouter.route('/profil/verifBadge')
.get(function (req, res) {

    var tabBadgeAjoute  =   [];
    var tabVerifBadge   =   [];

    //Etape 1 
    requete("my SQL request")
    .then( (rows) => {
        if (rows.length != 0){
            for (let competence of rows){
                if (competence.TotalLike >=5)    { tabVerifBadge.push("one SQL request"); tabBadgeAjoute.push(myString)}
                if (competence.TotalLike >=10)   { tabVerifBadge.push("one SQL request"); tabBadgeAjoute.push(myString)}
                if (competence.TotalLike >=25)   { tabVerifBadge.push("one SQL request"); tabBadgeAjoute.push(myString)}
                if (competence.TotalLike >=100)  { tabVerifBadge.push("one SQL request" ); tabBadgeAjoute.push(myString)}
            }
        }

    })
    //Etape 2 
    .then( () => {
        for (let requeteSQL in tabVerifBadge){
            requete(tabVerifBadge[requeteSQL].toString())
            .then( (rows2) => {
                if (rows2.length == 0){
                    requete("one SQL request")
                    .then(() => console.log("ok")
                    .catch( err => console.dir(err));
                };
            })
            .catch( err => console.dir(err));
        }

    })
    .then( () => 
        res.send(JSON.stringify({"status": 200, "error": null, "response": "ok"}))
    )
    .then((rows) => connection.end())
    .catch( err => {
        // handle the error
        console.dir(err);
    })



 })

1 Ответ

0 голосов
/ 03 апреля 2019

У вас есть петля for...of в вашем первом обещании и петля for...in во втором обещании. Вы не можете гарантировать, что запросы в этих двух Обещаниях будут выполнены, когда вы позвоните последнему .then(), чтобы закрыть соединение.

Попробуйте что-нибудь подобное:

.then(async function() {
    for (let requeteSQL in tabVerifBadge){
        await requete(tabVerifBadge[requeteSQL].toString())
            .then( (rows2) => {
                //...
            })
            .catch( err => console.dir(err));
    }
})

См. Также этот вопрос об альтернативных методах.

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