Ответ 1
Когда вы обещаете прототип, методы возврата обещания будут иметь * Async suffix
Идея promisification заключается в том, чтобы притворяться, будто библиотека была разработана для возврата promises для начала. Вы не должны вызывать promisify в коде приложения во время выполнения, но в вашем исходном коде начальной загрузки или аналогичном.
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();
});
});
}
В будущей версии будет значительно улучшено управление ресурсами, и вы сможете:
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"
});
}
});
}
Как использовать результат:
app.post("/login",function(req,res) {
post.login(req,res,con,mysql,p).then(function(Player) {
});
})