gpt4 book ai didi

javascript - promise 的连接不返回任何内容 (JS)

转载 作者:行者123 更新时间:2023-12-03 12:37:02 24 4
gpt4 key购买 nike

promise 连接出现问题

我最近将我的 Node 应用程序从在本地计算机上运行转换为使用 Amazon EC2 作为 Node 应用程序,并使用 VPN 来提供文件服务和 MySQL。

我对 Promises 有了足够的了解,可以利用 Bluebird 编写以下连接片段(在响应客户端之前运行 3 个查询) 。连接在我的机器上工作正常,但是使用 VPN 托管的 MySQL 设置,连接每次都会崩溃,大约在应用程序启动后 30 秒后,我意识到这可能是因为我忘记关闭它们。

编辑:根据评论,问题似乎不在于连接关闭。

所以我以我知道的最好方式修改了我的脚本来关闭连接,但是对于 Promises,这很令人困惑。此版本的连接不起作用。 它不会失败或导致任何错误。它只是在服务器端不返回任何结果。我认为我的问题在于我关闭连接的方式。

  • 是什么导致了这个问题?

  • 是连接关闭吗?

  • 如果是这样,我该如何正确关闭它们?

我的(简化的)MySQL 连接尝试 Bluebird promise

var mysql = require('mysql');
var Promise = require('bluebird');
var moment = require('moment');
function createConnection() {
var connection = mysql.createConnection({
dateStrings : true,
host : 'hostname',
user : 'username',
password : 'password',
database : 'database'
});
connection = Promise.promisifyAll(connection);
return connection;
}
function sendGame(req, res, sales, settings, categories, players) {
var game = new Object();
game.sales = sales;
game.players = players;
game.settings = settings;
game.categories = categories;
var JSONgame = JSON.stringify(game);
console.log("Game: " + JSON.stringify(game, undefined, 4));
}
var retrieveSales = Promise.method(function (username, connection, timeFrame) {
console.log('User ' + username + ' retrieving sales...');
var q = 'select * from sales_entries where date BETWEEN ? AND ?';
return connection.queryAsync(q, timeFrame).then(function (results) {
return results[0];
});
});
var retrieveSettings = Promise.method(function (username, connection) {
console.log('User ' + username + ' retrieving settings...');
var q = 'select * from sales_settings';
return connection.queryAsync(q).then(function (results) {
return results[0];
});
});
var retrieveCategories = Promise.method(function (username, connection) {
console.log('User ' + username + ' retrieving categories...');
var q = 'select * from sales_categories';
return connection.queryAsync(q).then(function (results) {
return results[0];
});
});
var retrievePlayers = Promise.method(function (username, connection) {
console.log('User ' + username + ' retrieving players...');
var q = 'select * from users';
return connection.queryAsync(q).then(function (results) {
return results[0];
});
});
var gameSucceed = Promise.method(function gameSucceed(req, res) {
var username = req.body.username;
console.log('User ' + req.body.username + ' retrieving game...');
var timeFrame = [moment().days(0).hour(0).minute(0).second(0).format("YYYY-MM-DD HH:mm:ss"), moment().days(6).hour(0).minute(0).second(0).format("YYYY-MM-DD HH:mm:ss")];
//var connection = Promise.promisifyAll(createConnection());
return connection.connectAsync().then(function () {
console.log('Connection with the MySQL database openned for Game retrieval...');
return Promise.all([retrieveSales(username, connection, timeFrame), retrieveSettings(username, connection), retrieveCategories(username, connection), retrievePlayers(username, connection)]);
}).then(function () {
connection.end(),
console.log("...Connection with the MySQL database for Game retrieval ended")
});
});
function getGameData(req, res) {
gameSucceed(req, res).spread(function (sales, settings, categories, players) {
return sendGame(req, res, sales, settings, categories, players);
});
};
var req = new Object();
var res = new Object();
req.body = {
"username" : "user123",
"password" : "password"
}
getGameData(req, res);

控制台结果

User user123 retrieving game...  
Connection with the MySQL database openned for Game retrieval...
User user123 retrieving sales...
User user123 retrieving settings...
User user123 retrieving categories...
User user123 retrieving players...
...Connection with the MySQL database for Game retrieval ended
Game: {}

最佳答案

var gameSucceed = function gameSucceed(req, res) {

var connection = createConnection());
return connection.connectAsync().then(function () {
return Promise.all([…]);
}).then(function () {
connection.end();
});
};

从此方法最终返回的 Promise 没有解析值。它是由 then 调用创建的,您不会从其回调中返回 - 这将导致未定义。要解决此问题,只需将结果路由到:

.then(function(results) {
connection.end();
return results;
});

但是,如果您这样做,则在发生错误时连接不会关闭。最好的解决方案是使用 finally() method ,它的作用就像同步代码中的finally子句。对于解决方案和拒绝都会调用它的回调,并且生成的 Promise 将自动继承该值。

.finally(function() {
connection.end();
})
// .then(function(results) { })

关于javascript - promise 的连接不返回任何内容 (JS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23691800/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com