javascript - the - Rompí mi promesa
title html (1)
Cuando prometas un prototipo, los métodos de devolución de promesa tendrán * un sufijo asíncrono
La idea de promisificación es simular que la biblioteca fue diseñada para devolver promesas para empezar. No debe llamar a promisify en el código de la aplicación durante el tiempo de ejecución, sino en el código de inicio de su programa de arranque o similar.
var mysql = require("mysql");
var Promise = require("bluebird");
//Only need to be called once per application so probably not here
Promise.promisifyAll(require("mysql/lib/Connection").prototype);
Promise.promisifyAll(require("mysql/lib/Pool").prototype);
function login(req,res,con,mysql,P) {
return con.getConnectionAsync().then(function(connection) {
return connection.queryAsync(''SELECT password,id FROM player WHERE name=''+
mysql.escape(req.body.user)).spread(function(rows, fields) {
if (hash.verify(req.body.pass,rows[0].password)) {
req.session.loggedIn = true;
req.session.user = rows[0].id;
var ref = new P(rows[0].id,con,req);
res.send({
"msg":"You have logged in!",
"flag":false,
"title":": Logged In"
});
return ref;
} else {
res.send({
"msg":"Your username and or password was incorrect.",
"flag":true,
"title":": Login Failed"
});
}
}).finally(function() {
connection.release();
});
});
}
Una versión futura tendrá una administración de recursos mucho mejor y usted podrá hacer:
function login(req,res,con,mysql,P) {
return Promise.using(con.getConnectionAsync(), function(connection) {
return connection.queryAsync(''SELECT password,id FROM player WHERE name=''+
mysql.escape(req.body.user));
}).spread(function(rows, fields) {
if (hash.verify(req.body.pass,rows[0].password)) {
req.session.loggedIn = true;
req.session.user = rows[0].id;
var ref = new P(rows[0].id,con,req);
res.send({
"msg":"You have logged in!",
"flag":false,
"title":": Logged In"
});
return ref;
} else {
res.send({
"msg":"Your username and or password was incorrect.",
"flag":true,
"title":": Login Failed"
});
}
});
}
Cómo utilizar el resultado:
app.post("/login",function(req,res) {
post.login(req,res,con,mysql,p).then(function(Player) {
});
})
Así que ... estoy teniendo dificultades para aprender a prometer.
Estoy usando bluebird
( https://github.com/petkaantonov/bluebird ) como se me sugirió, con el fin de domesticar mi infierno de devolución de llamada que he estado recibiendo. Ejemplo:
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;
}
Es desagradable, está lleno de devoluciones de llamada, y la función devuelve ref
antes de que la consulta devuelva la llamada.
Solución: ¡promete!
Intenté convertir mi función usando el inicio rápido ... así que le promisefyAll
mi módulo mysql
antes de crear la conexión:
var mysql = require("mysql");
var Promise = require("bluebird");
Promise.promisifyAll(mysql);
Y escribí mi función de la siguiente manera:
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;
});
}
Pero sigo obteniendo TypeError: Cannot call method ''then'' of undefined at Object.login (/var/www/post/posts.js:36:22)
Y
TypeError: undefined is not a function at Pool.<anonymous> (/var/www/node_modules/mysql/lib/Pool.js:53:14)
Errores ¿Puede alguien ayudarme a entender cómo implementar promesas para consultar mi base de datos (correctamente)?
Editar (aceptación de post respuesta :): así es como llamo a la función de inicio de sesión:
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