SailsJS Waterline 与 Bluebird Promises

2023-12-25

使用 Waterline ORM 时,如果我想使用默认提供的 bluebird Promise api,如何将处理传递回控制器。

下面是代码:

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) 可以。


遵守承诺的关键是永远不要打破链条。承诺链取决于每一步返回一个承诺或一个价值,或者throwing一个错误。

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

  • 路径中的每个回调都会返回一些内容,每个函数都会返回它所使用的承诺链(甚至.auth();它可能在某些时候有用)
  • 我用过蓝鸟的.promisifyAll()使bcrypt一起玩
  • 我已经脱钩了.authenticate()从您的请求/响应基础设施中,通过使username and password论点明确。这样可以更轻松地重复使用。

现在我们有了(没有 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 + ')');
        });
    }
};

and

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");
            }
        });
    }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SailsJS Waterline 与 Bluebird Promises 的相关文章

随机推荐

  • Django-Tastypie:如何访问 Bundle 中的 (Http)request 对象?

    我需要访问资源脱水中的 HttpRequest 对象 方法 在文档中 它表明bundle request是一个有效的属性 它是 在 resources html 页面中 当我尝试将其添加到我的代码中时 我得到一个 错误声称 Bundle 对
  • 如何使用 useReducer([state,dispatch]) 和 useContext 避免无用的重新渲染?

    当使用多个 useReducers 时 每个组件都会使用部分状态重新渲染 import React useContext from react import Store from store import setName from acti
  • 在 Swift 中获取 UIBarButtonItem 的框架?

    我怎样才能快速获得 rightbarbuttonItem 的框架 我找到了这个 UIBarButtonItem 如何找到它的框架 https stackoverflow com questions 14318368 uibarbuttoni
  • 使用 tlmgr 搜索所有关键字

    我想知道如何查找所有 TeX Live 关键字 我正在使用 Windows 10 和 TeX Live 2019 我尝试过这个命令tlmgr search list keyword但我没有收到 except 结果 这种语法不再可能了 看着h
  • 在 UML 类图中,什么是边界类、控制类和实体类?

    我现在使用 NetBeans 作为我选择的 IDE 它有一个用于 UML 建模的插件 在类图中 有一些模型元素称为Boundary Class Control Class and Entity Class 然而 我找不到它们的一个好的定义
  • 为什么 PL/SQL 不尊重角色授予的权限?

    执行 PL SQL 块时 授予角色的任何权限都将被忽略 相反 您必须为特定用户提供特定的授权才能运行它 如果我想授予 DBA 访问包 函数或过程的权限 我无法向 DBA 角色授予权限 我必须向 DBA 角色中的每个用户授予授权 如果用户不再
  • 在这种情况下我应该使用 Drools 吗?

    我将使用大学的图书馆系统来解释我的用例 学生在图书馆系统中注册并提供个人资料 性别 年龄 院系 以前完成的课程 当前注册的课程 已借阅的书籍等 图书馆系统中的每本书都会根据学生的资料定义一些借阅规则 例如 计算机算法课本只能由当前注册该班级
  • 未能@AutoWire @WebServlet 中的成员

    我似乎无法将我的 servlet 的字段传递给 AutoWire 他们最终归零 我有一个纯注释配置的 web 应用程序 没有 XML 文件 我的 servlet 看起来像这样 WebServlet service public class
  • 将 python Webserver 作为 Windows 服务运行

    我有服务器和控制台scripts http svn python org projects python trunk Lib CGIHTTPServer py它继续监听端口上的控制台和服务器请求 在 UNIX 环境中 我将服务器和控制台脚本
  • 在脚本中使用临时函数或过程

    我在用SQL Server 2012 我有一个脚本 通过它我可以将值插入到表中 在该脚本中我必须转换某些值的格式DateTime基于两个参数的变量 我可以使用CASE or if条件在sql 我不被允许做任何Function or proc
  • 如何在卡片操作中单击时调用特定回调 - Bot Framework

    我展示了一个带有一些产品的轮播 每个产品都有一个带有代码的按钮 卡片操作类型为 ImBack 但一旦通过 postAsync 方法显示轮播 单击按钮将再次调用根对话框 有没有办法定义按钮单击的回调或显示相同的轮播但使用 PromptDial
  • Windows Vista 中的安装文件名

    我在这篇文章中读到 http technet microsoft com en us library cc709628 aspx http technet microsoft com en us library cc709628 aspx
  • QTableView:当用户使用鼠标单击特定单元格时如何获取数据

    其实我是Qt新手 无法匹配QMouseEvent with QTableview 请帮助解决这个问题 下面是一个示例 说明如何在单击表格单元格时获取该单元格的文本 假设一个QTableView定义在一些MyClass班级 你需要connec
  • 如何使用 Bower 安装 Bootstrap v4 alpha? [复制]

    这个问题在这里已经有答案了 The v4 alpha 文档 http v4 alpha getbootstrap com getting started download states Bootstrap v4 0 0 alpha 可以通过
  • 如何运行将数据加载到其他项目 BigQuery Table 的云编辑器任务

    我在项目 A 下创建了云编辑器环境 我想将数据加载到其他项目 B BigQuery 表中 我知道任务 GCSToBigQueryOperator 但它没有成功 它失败了 我想知道如何实现这一点 我想从项目 A 运行一个将数据加载到项目 B
  • 滚动到 angular2 时动画进入视图

    我找到了一个库 用于在滚动到 aos https github com michalsnik aos 但它似乎没有任何 angular2 绑定可供使用 有谁知道如何在 Angular2 中完成类似的事情 或者至少配置 aos 在 Angul
  • 如何在iPhone中创建应用程序包?

    我使用 XCode 制作了一个小型应用程序 我如何创建一个应用程序包以将其安装在 iPhone 中 谁能帮我解决这个问题 提前致谢 是的 如上所述 您需要支付 99 美元的开发者费用 完成此操作后 您可以通过 XCode 直接部署到使用配置
  • PHP 中的数组打乱顺序

    我有以下代码 输出如下 域名 com image1 jpg 域名 com image2 jpg 域名 com image3 jpg 我正在尝试随机化输出的顺序 在 foreach 语句之前 我尝试使用 shuffle bb 对数组进行洗牌
  • 创建与 DetailView 相反的视图

    上传图像后 我试图从 CreateView 反转到 DetailView 我收到同样的消息 NoReverseMatch 位于 photo image add 未找到带有参数 和关键字参数 pk 50 的 image view 的反向操作
  • SailsJS Waterline 与 Bluebird Promises

    使用 Waterline ORM 时 如果我想使用默认提供的 bluebird Promise api 如何将处理传递回控制器 下面是代码 module exports Authenticate auth function req res