Javascript Node MySQL-承诺永远不会结束

Javascript Node MySQL-承诺永远不会结束,javascript,mysql,node.js,promise,Javascript,Mysql,Node.js,Promise,我对node中的承诺有一个问题,特别是在下面的代码中,我编写该代码是为了执行一个MySQL查询,以便我的所有其他100多个函数都可以共享它,而不是内联编写它。从PHP开发开始,了解承诺和其他东西的好处是一个学习过程,现在我遇到了一个小问题。以下是将query作为参数执行并返回响应的函数: var mysql = require('mysql'); const myDBConnection = mysql.createPool({ host: '127.0.0.1', user:

我对node中的承诺有一个问题,特别是在下面的代码中,我编写该代码是为了执行一个MySQL查询,以便我的所有其他100多个函数都可以共享它,而不是内联编写它。从PHP开发开始,了解承诺和其他东西的好处是一个学习过程,现在我遇到了一个小问题。以下是将
query
作为参数执行并返回响应的函数:

var mysql = require('mysql');
const myDBConnection = mysql.createPool({
    host: '127.0.0.1',
    user: "username",
    password: "password",
    database: "dbName",
    connectionLimit: 101,
});


class DBQueryRunner {
    query(query) {
        return new Promise((resolve, reject) => {
            myDBConnection.getConnection((err, connection) => {


                const myQuery = mysql.format(query.string, query.params);
                connection.query(myQuery, function(err, data) {
                    return (err ? reject(err) : resolve(data));
                    connection.release();
                });

            });

        });


    }
}
代码运行正常,值返回给调用者,但它似乎没有终止,不管我尝试了什么,我担心它会占用CPU资源

下面是一个示例函数,您可以在命令行中与上面的函数一起运行,以查看发生了什么

function test() {
let DBQueryRunner = require("./theAboveCode.js");
const myDB = new DBQueryRunner();

let query = {
    string: `SELECT 1+1 AS Output`,
    params: []
};


return myDB.query(query).then(rows => {
console.log(rows)
    return (rows);
});

}
问题:
-承诺是否有必要终止?
-我的代码中有错误吗?
-有没有更好的方法来实现我所拥有的可重用数据库执行功能

更新-我还尝试了另一种使用Bluebird“promisify”mysql库的方法。该函数仍然没有结束,我必须在终端中按住CTRL+C键才能退出它

let mysql = require('mysql');
let Promise = require('bluebird');

Promise.promisifyAll(require("mysql/lib/Connection").prototype);
Promise.promisifyAll(require("mysql/lib/Pool").prototype);


let myDBConnection = mysql.createPool({
  host: '127.0.0.1',
  user: "username",
  password: "password",
  myDBConnection: "dbName",
  connectionLimit: 101,
});




class DBQueryRunner {
  query(query) {
    let pool = Promise.promisifyAll(mysql);

        return myDBConnection.getConnectionAsync()
            .then(function (conn) {
                 myDBConnection = Promise.promisifyAll(conn);
                 return myDBConnection.queryAsync(query.string, query.params);
            })
            .then(function (results) {
                 if (results.length < 1) {
                     return "No results were found";
                 } else {
                     return results;
                    //  resolve(results);  //This method doesn't work with resolve/reject so I already am confused by it.
                 }
            })
            .catch(function (err) {
                 console.log(err);
                 throw err;
            })
            .finally(function () {
                 if (myDBConnection) {
                     myDBConnection.release();
                     console.log("Released the connection")
                 }
            });
    }

}
let mysql=require('mysql');
让承诺=要求(‘蓝鸟’);
promisifyAll(require(“mysql/lib/Connection”).prototype);
promisifyAll(require(“mysql/lib/Pool”).prototype);
让myDBConnection=mysql.createPool({
主持人:“127.0.0.1”,
用户:“用户名”,
密码:“密码”,
myDBConnection:“dbName”,
连接限制:101,
});
类DBQueryRunner{
查询(查询){
let pool=Promise.promisifyAll(mysql);
返回myDBConnection.getConnectionAsync()
.然后(功能(连接){
myDBConnection=promisefyall(conn);
返回myDBConnection.queryAsync(query.string,query.params);
})
.然后(函数(结果){
如果(结果长度<1){
返回“未找到任何结果”;
}否则{
返回结果;
//resolve(results);//此方法不适用于resolve/reject,因此我已经被它弄糊涂了。
}
})
.catch(函数(err){
控制台日志(err);
犯错误;
})
.最后(函数(){
if(myDBConnection){
myDBConnection.release();
log(“释放连接”)
}
});
}
}
您应该调用resolve('some data to return');当所有操作和您释放mysql描述符时。试着把它改成

connection.release(); 
return (err ? reject(err) : resolve(data)); // The return operator will EXIT from function before connection released. Maybe this is what causes the problem
承诺是否有必要终止

承诺不会终止。承诺有三种状态:运行、拒绝、解决。因此,如果您之前的承诺仍在执行,则不会调用.then()链。所以,是的,您必须为您的承诺设置适当的状态:已解决或已拒绝,以便调用下一个链接操作

我的密码有错误吗

是的,您在使用return语句时肯定弄错了。请注意,一旦调用了return,您的函数就会终止,并且return语句之后的代码将不会执行

您应该调用resolve('some data to return');当所有操作和您释放mysql描述符时。试着把它改成

connection.release(); 
return (err ? reject(err) : resolve(data)); // The return operator will EXIT from function before connection released. Maybe this is what causes the problem
承诺是否有必要终止

承诺不会终止。承诺有三种状态:运行、拒绝、解决。因此,如果您之前的承诺仍在执行,则不会调用.then()链。所以,是的,您必须为您的承诺设置适当的状态:已解决或已拒绝,以便调用下一个链接操作

我的密码有错误吗


是的,您在使用return语句时肯定弄错了。请注意,一旦调用return,您的函数就会终止,并且return语句后的代码将不会执行

我找到了解决问题的方法

使用
connection.destroy()


我在原始帖子中发布的两组代码确实有效,因此将来可能会帮助其他人。

我找到了解决问题的方法

使用
connection.destroy()


我在原始帖子中发布的两组代码确实有效,因此将来可能会对其他人有所帮助。

根据您的代码,您将永远无法访问指令
connection.release()因为您之前有一个return语句;也许您应该在返回连接之前释放连接value@oliv37你好,我已经试过了,没什么区别。我刚刚有一百个代码版本在尝试不同的东西。它最初是在返回之前根据您的代码,您将永远无法到达指令
connection.release()因为您之前有一个return语句;也许您应该在返回连接之前释放连接value@oliv37你好,我已经试过了,没什么区别。我刚刚有一百个代码版本在尝试不同的东西。它最初是在returnHello之前,所以即使我删除了
return(err?reject(err):resolve(data))行,并将其替换为仅解析(数据)