Така че.. Най-трудно ми е да се науча как да обещавам.
Използвам bluebird
(https://github.com/petkaantonov/bluebird), както ми беше предложено - - за да укротя ада си за обратно обаждане, който получавам. Пример:
function login(req,res,con,mysql,P) {
var ref = undefined;
con.getConnection(function(err,connection) {
if (err) console.log("Get Connection Error.. "+err);
con.query('SELECT password,id FROM player WHERE name='+mysql.escape(req.body.user),function(err,rows,fields) {
if (err) throw err;
if (!rows[0]) {
res.send({
"msg":"Your username and or password was incorrect.",
"flag":true,
"title":": Login Failed"
});
}
if (rows[0].password !== "undefined") {
if (hash.verify(req.body.pass,rows[0].password)) {
req.session.loggedIn = true;
req.session.user = rows[0].id;
ref = new P(rows[0].id,con,req);
res.send({
"msg":"You have logged in!",
"flag":false,
"title":": Logged In"
});
} else {
res.send({
"msg":"Your username and or password was incorrect.",
"flag":true,
"title":": Login Failed"
});
}
}
});
connection.release();
});
console.log(ref);
return ref;
}
Гадно е, пълно е с обратни извиквания и функцията връща ref
преди обратното извикване на заявката да приключи изпълнението.
Решение: обещания!
Опитах се да конвертирам функцията си с помощта на бързия старт.. така че promisefyAll
направих своя mysql
модул, преди да създам връзката:
var mysql = require("mysql");
var Promise = require("bluebird");
Promise.promisifyAll(mysql);
И написах функцията си, както следва:
function login(req,res,con,mysql,P) {
var ref = undefined;
Promise.promisify(con.getConnection)().then(function(connection) { //updated line returns error no method promisify. Bluebird v. 1.1.1
con.query('SELECT password,id FROM player WHERE name='+mysql.escape(req.body.user)).then(function(rows,fields) {
if (hash.verify(req.body.pass,rows[0].password)) {
req.session.loggedIn = true;
req.session.user = rows[0].id;
ref = new P(rows[0].id,con,req);
res.send({
"msg":"You have logged in!",
"flag":false,
"title":": Logged In"
});
} else {
res.send({
"msg":"Your username and or password was incorrect.",
"flag":true,
"title":": Login Failed"
});
}
});
return ref;
});
}
Но продължавам да получавам TypeError: Cannot call method 'then' of undefined at Object.login (/var/www/post/posts.js:36:22)
И
TypeError: undefined is not a function at Pool.<anonymous> (/var/www/node_modules/mysql/lib/Pool.js:53:14)
Грешки. Може ли някой да ми помогне да разбера как да прилагам обещания за запитване към моята база данни (правилно)?
Редактиране (приемане на отговор след:): ето как извиквам функцията за влизане:
app.post("/login",function(req,res) {
Player = post.login(req,res,con,mysql,p);
console.log(Player); // logs [Object object]
}); //inside the login function, it logs the object like it should
con.getConnection()
? Можете ли да опитатеconsole.log
gin it? - person thefourtheye   schedule 25.03.2014undefined
. Но работи перфектно (без връщането на обект) в претрупаната, гадна функция, която се опитвам да преработя. - person Sterling Archer   schedule 25.03.2014