【发布时间】:2014-05-16 22:35:10
【问题描述】:
承诺连接问题
我最近将我的 Node 应用程序从在我的本地计算机上运行转换为使用 Amazon EC2 来运行 Node 应用程序以及使用 VPN 来提供文件服务和 MySQL。
我对 Promises 的了解足以编写以下连接 sn-p(在响应客户端之前运行 3 个查询),使用 Bluebird。连接在我的机器上工作,但使用 VPN 托管的 MySQL 设置,连接每次都崩溃,大约在应用程序启动后 30 秒,我意识到这可能是因为我忘记关闭它们。
编辑:根据 cmets,看来问题不在于连接关闭。
所以我以我知道的最好的方式修改了我的脚本来关闭连接,但是对于 Promises,这很令人困惑。此版本的连接不起作用。 它不会失败或导致任何错误。它只是在服务器端不返回任何结果。我认为我的问题在于我关闭连接的方式。
导致问题的原因是什么?
是连接关闭吗?
如果是这样,我将如何正确关闭它们?
我的(简化的)MySQL 连接尝试与Bluebird Promises
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: {}
【问题讨论】:
-
任何第二次查看这个问题的人,我都犯了一个错误,将我的 MySQL 连接详细信息公开。我已更改它们,但不希望通过编辑查看获得信息,因此我删除并重新发布了问题。
-
你会同时使用两个 Promise 库吗?蓝鸟应该有你需要的一切。我的意思是,你甚至没有在任何地方使用
Q? -
@Bergi 我对每个库的功能有些困惑。建议将两者中的一点作为解决我在应用程序的各个方面遇到的各种问题的解决方案。
-
我可能在应用程序的不同位置使用 Q - 这只是一个片段。我将从问题中删除 Q 。 @Bergi
-
实际上他们应该做同样的事情,afaik Bluebird 也提供了 Q 的所有方法。如果没有,请随时询问有关转换它的问题;即使他们应该一起玩得很好,只使用一个会更干净,而且不需要任何转换也不那么麻烦。
标签: javascript node.js promise q bluebird