Я нарушил свое обещание

Так что ... мне тяжело учиться обещать.

я использую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

Ответы на вопрос(1)

Ваш ответ на вопрос