【问题标题】:Async call, promise pending异步调用,promise 挂起
【发布时间】:2019-06-04 23:41:53
【问题描述】:

我是 Node.js 的新手,在我运行代码时进行身份验证 Promise 始终处于挂起状态。

错误

is Authenticated ?:  Promise { pending }

承诺{待处理}

我尝试了不同的方法来使用等待,但我找不到正确的方法。感谢帮助。

代码

return new Promise((resolve, reject) =>
{
console.log(email, password);
var isAuthenticated = false;
isAuthenticated= model.authenticate(email, password).then(function(result){
    //console.log(model.authenticate(email, password));
    console.log("is Authenticated ?: ",isAuthenticated);
    if(isAuthenticated) {
        console.log(isAuthenticated);
        console.log("Success!");
        res.render('/home');
    } else {
        console.log("ko");
        res.redirect("/");
    }
    }).catch(function(error) {
        console.log(error);
    });
});




User.prototype.authenticate = function( email, password ) {
    connection = this.connection;
    return new Promise(function(resolve, reject){
        connection.query('SELECT * FROM users WHERE email = ? AND Password = ? AND is_deleted = 0',[email, password], 
        function (error, results, fields) {
            if (error){
                console.log("error ocurred",error);
                reject(error);
                return false;
            } else {
                resolve(results);
                return true;
            }
        });
    });
};

【问题讨论】:

    标签: mysql node.js asynchronous synchronization


    【解决方案1】:

    让我们重构第一个博客,将其命名为 promiseFunction。可以用这些方式编写它,以便它始终返回承诺。

     const promiseFunction = function (req, res, next) {
    // I am assuming it is a express middleware and res is passed as the function arguments.
    return new Promise((resolve, reject) => {
        console.log(email, password);
        var isAuthenticated = false;
        isAuthenticated = model.authenticate(email, password)
            .then(function (result) {
                //console.log(model.authenticate(email, password));
                console.log("is Authenticated ?: ", isAuthenticated);
                if (isAuthenticated) {
                    console.log(isAuthenticated);
                    console.log("Success!");
                    res.render('/home');
                    return resolve()
                }
                else {
                    console.log("ko");
                    res.redirect("/");
                    return resolve()
                }
            }).catch(function (error) {
                console.log(error);
                return reject(error)
            });
    });
    }
    

    上述代码将始终返回承诺。 更好的方法将是

    const promiseFunction = function (req, res, next) {
    // I am assuming it is a express middleware and res is passed as the function arguments.
    return model.authenticate(email, password)
        .then(function ({ isAuthenticated }) {
            //console.log(model.authenticate(email, password));
            console.log("is Authenticated ?: ", isAuthenticated);
            if (isAuthenticated) {
                console.log(isAuthenticated);
                console.log("Success!");
                res.render('/home');
            }
            else {
                console.log("ko");
                res.redirect("/");
            }
        })
    }
    

    身份验证功能是:

    User.prototype.authenticate = function (email, password) {
    connection = this.connection;
    
    return new Promise(function (resolve, reject) {
        connection.query('SELECT * FROM users WHERE email = ? AND Password = ? AND is_deleted = 0', [email, password], function (error, results, fields) {
            if (error) {
                console.log("error ocurred", error);
                return reject(error);
            }
            else {
                var newResponse = Object.assign({}, response, {isAuthenticated: true})
                return resolve(newResponse);
            }
        });
    });
    };
    

    【讨论】:

    • 谢谢,但是当我运行代码时它一直在等待而不是显示任何响应。
    • 你在使用 Express 吗?
    • 在发送响应后使用下一个回调。像使用 res.render('/home') 后的 next()
    • 同样的结果.. 出现 localhost 错误后仍在等待 No data received ERR_EMPTY_RESPONSE
    • 你能告诉我要点吗?所以我会看看那个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多