what the tag for attribute javascript node.js promise bluebird

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