首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SailsJS水系与蓝鸟承诺

SailsJS水系与蓝鸟承诺
EN

Stack Overflow用户
提问于 2015-06-05 05:55:31
回答 1查看 4.2K关注 0票数 5

当使用水平线ORM时,如果我想使用默认情况下提供的bluebird承诺api,那么如何将处理传递回控制器。

以下是代码:

代码语言:javascript
复制
module.exports = {
    //Authenticate
    auth: function (req, res) {
        user = req.allParams();
        //Authenticate
        User.authenticate(user, function (response) {
            console.log(response);
            if (response == true) {
                res.send('Authenticated');
            } else {
                res.send('Failed');
            }
        });
    }
};


module.exports = {
    // Attributes

    // Authenticate a user
    authenticate: function (req, cb) {
        User.findOne({
            username: req.username
        })
        .then(function (user) {
            var bcrypt = require('bcrypt');
            // check for the password
            bcrypt.compare(req.password, user.password, function (err, res) {
                console.log(res);
                if (res == true) {
                    cb(true);
                } else {
                    cb(false);
                }
            });
        })
        .catch(function (e) {
            console.log(e);
        });
    }
};

我只是在尝试实现一个身份验证函数。业务逻辑是直接的。我感到困惑的是,从那时起,请求流是如何被返回给控制器的。如果我试图返回一个响应,这个承诺不会响应,但是执行cb(value)是有效的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-06 08:06:08

履行承诺的关键是永远不要打破锁链。承诺链取决于返回承诺或值或抛出错误的每一步。

下面是对代码的重写。请注意,

  • 路径中的每个回调都返回一些内容,每个函数都返回它所使用的承诺链(甚至.auth();它在某个时候可能很有用)
  • 我用蓝知更鸟的.promisifyAll()bcrypt一起玩
  • 通过使.authenticate()password参数显式化,我已经将username与您的请求/响应基础结构分离开来。这样,它可以更容易地重复使用。

所以现在我们有(不是100%的测试,我没有费心安装水管):

代码语言:javascript
复制
module.exports = {
    // authenticate the login request
    auth: function (req, res) {
        var params = req.allParams();
        return User.authenticate(params.username, params.password)
        .then(function () {
            res.send('Authenticated');
        })
        .fail(function (reason) {
            res.send('Failed (' + reason + ')');
        });
    }
};

代码语言:javascript
复制
var Promise = require("bluebird");
var bcrypt = Promise.promisifyAll(require('bcrypt'));

module.exports = {
    // check a username/password combination
    authenticate: function (username, password) {
        return User.findOne({
            username: username
        })
        .then(function (user) {
            return bcrypt.compareAsync(password, user.password)
        })
        .catch(function (err) {
            // catch any exception problem up to this point
            console.log("Serious problem during authentication", err);
            return false;
        })
        .then(function (result) {
            // turn `false` into an actual error and
            // send a less revealing error message to the client
            if (result === true) {
                return true;
            } else {
                throw new Error("username or password do not match");
            }
        });
    }
};
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30659272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档