Проблема с обещанными соединениями
Недавно я перевел свое приложение Node с локального компьютера на использование Amazon EC2 для приложения Node и VPN для работы с файлами и MySQL.
Я достаточно узнал об обещаниях, чтобы написать следующий фрагмент соединения (который запускает 3 запроса, прежде чем ответить клиенту), используя Синяя птица. Соединения работали на моей машине, но с настройками MySQL, размещенными в VPN, соединения каждый раз прерывались примерно через 30 секунд после запуска приложения, что, как я понял, вероятно, было связано с тем, что я забыл закрыть их.
РЕДАКТИРОВАТЬ: Судя по комментариям, проблема не в закрытии соединения.
Поэтому я изменил свой сценарий наилучшим из известных мне способов, чтобы закрыть соединения, но с промисами это сбивает с толку. Эта версия подключения не работает. Он не дает сбоев и не вызывает ошибок. Он просто не возвращает никаких результатов на стороне сервера. Я думаю, что моя проблема в том, как я закрыл соединения.
Что вызывает проблему?
Это закрытие соединения?
Если да, то как мне их правильно закрыть?
Моя (упрощенная) попытка подключения к 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: {}
Q
? - person Bergi   schedule 16.05.2014JSONgame
пропускаетvar
и что вы дважды вызываетеPromise.promisifyAll()
при соединении, это только пережитки вашего упрощения? Если это так, пожалуйста, исправьте их. - person Bergi   schedule 16.05.2014