多重承诺后如何关闭MySQL连接?

时间:2019-04-02 15:02:34

标签: mysql node.js promise

我必须使用多个SQL请求。因此,我创建了一个Promise来做到这一点。但是我需要将此承诺用于相同的承诺。当我尝试使用“ connection.end()”停止SQL连接时,在控制台中出现此错误:
错误:调用退出后无法使查询入队。

如果我不写“ 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 :(得分:0)

在第一个Promise中有一个for...of循环,在第二个Promise中有一个for...in循环。您不能保证在调用最后一个.then()以关闭连接时,这两个Promise中的查询将完成。

尝试类似的事情:

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

另请参见此question