node.js - SailsJS 水线与 bluebird promise

标签 node.js sails.js waterline

使用水线 ORM 时,如果我想使用默认提供的 bluebird promise api,我该如何将处理过程传回 Controller 。

代码如下:

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);
        });
    }
};

我只是想实现一个身份验证功能。业务逻辑很简单。我感到困惑的是请求流是如何交还给 Controller 的。如果我尝试返回响应, promise 不会响应,但执行 cb(value) 会起作用。

最佳答案

使用 promise 的关键是永远不要破坏链条。 promise 链取决于每一步,要么返回一个 promise 或一个值,要么抛出一个错误。

以下是您的代码的重写。注意

  • 路径中的每个回调都会返回一些东西,每个函数都会返回它所使用的 promise 链(甚至 .auth();它在某些时候可能会有用)
  • 我已经使用 BlueBird 的 .promisifyAll() 来制作 bcrypt 一起玩
  • 我通过使 usernamepassword 参数显式化,将 .authenticate() 从您的请求/响应基础结构中分离出来。这样可以更轻松地重复使用它。

所以现在我们有(没有 100% 测试,我没有安装水线):

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 + ')');
        });
    }
};

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");
            }
        });
    }
};

关于node.js - SailsJS 水线与 bluebird promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30659272/

相关文章:

node.js - Heroku 应用程序的环境管理 Node.js 插件/方法?

node.js - Strapi 上传插件 - 如何放置由 Strapi 后端 js 代码生成的文件

node.js - js Pub/Sub 出现错误 : Must specify an `id` when calling `Model.room(id)` with Sails.

database - SailsJS 的外键约束

sails.js - 如何访问sails.js生命周期回调中的请求对象?

javascript - 使用 Express 发出 POST 请求时出错

javascript - 如何在 Node js express 中添加密码检查中间件

node.js - 如何使 Sails 模型随时随地指向不同的数据库?

node.js - Sails + 在单个 heroku 服务器上使用react?

mysql - 在不使用主键的情况下在 sails js 中填充一对多关系