Javascript Node MySQL-承诺永远不会结束
我对node中的承诺有一个问题,特别是在下面的代码中,我编写该代码是为了执行一个MySQL查询,以便我的所有其他100多个函数都可以共享它,而不是内联编写它。从PHP开发开始,了解承诺和其他东西的好处是一个学习过程,现在我遇到了一个小问题。以下是将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:
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))代码>行,并将其替换为仅解析(数据)承诺永远不会实现。我也试着不回复承诺,但我必须这样做,否则打电话的人永远不会收到任何东西。当然,如果return语句终止函数,这不会导致它“挂起”我的命令行?更新-我使用Bluebird尝试了另一种方法,它仍然会导致函数在我的终端中无限运行,直到我手动关闭它。在我的原始帖子中看到更新。这里的检查示例看起来很不错。注意康涅狄格州