如何处理异步。护照和猫鼬的 findOrCreate 方法

2024-04-03

身份验证模块“Passport”需要 FindOrCreate 方法才能进行登录。我使用 mongoose 来保存我的用户,其架构如下:

var UserSchema = new Schema({
    firstname: String,
    lastname: String,
    email: String,
    accounts: []
});

帐户数组包含代表 Facebook 帐户的对象,例如{provider: "facebook", uid: "someFacebookId"}.

我的身份验证策略如下所示:

// Authentication Strategy
passport.use(new FacebookStrategy({
    clientID: CONFIG.fb.appId,
    clientSecret: CONFIG.fb.appSecret,
    callbackURL: CONFIG.fb.callbackURL
  },
  function(accessToken, refreshToken, profile, done) {
    // asynchronous verification, for effect...
    process.nextTick(function () {

      User.find({ 'accounts.uid': profile.id, 'accounts.provider': 'facebook' }, function(err, olduser) {

          if(olduser._id) {
            console.log('User: ' + olduser.firstname + ' ' + olduser.lastname + ' found and logged in!');
            done(null, olduser);
          } else {
            var newuser = new User();
            var account = {provider: "facebook", uid: profile.id};
            newuser.accounts.push(account);
            newuser.firstname = profile.name.givenName;
            newuser.lastname = profile.name.familyName;
            newuser.email = "TBD...";

            newuser.save(function(err) {
              if(err) { throw err; }
              console.log('New user: ' + newuser.firstname + ' ' + newuser.lastname + ' created and logged in!');
              done(null, newuser);
            });
          }
        });
    });
  }
));

Problem:查询我的数据库后(User.find(...))回调函数立即执行,无需等待我的数据库应答。这会导致未定义的结果olduser目的。因此,每次该用户尝试登录时,我都会在数据库中获取同一用户的副本。

如何正确处理这个异步回调?


User.find返回一个array符合您条件的文件。在你的情况下你想使用User.findOne相反,然后检查if (olduser)...确定是否找到匹配的文档。

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

如何处理异步。护照和猫鼬的 findOrCreate 方法 的相关文章

  • node-mongodb-native的插入性能

    我正在使用 MongoDB 测试 Node js 的性能 我知道其中每一个都很好 彼此独立 但我正在尝试一些测试来感受它们 我遇到了这个问题 但无法确定来源 问题 我正在尝试在单个 Node js 程序中插入 1 000 000 条记录 它
  • 如何调试 Node.js 应用程序?

    如何调试 Node js 服务器应用程序 现在我主要使用警报调试打印语句如下 sys puts sys inspect someVariable 一定有更好的调试方法 我知道谷歌浏览器 http en wikipedia org wiki
  • npm install 不起作用,抛出错误

    我正在尝试在 nodejs 中安装 yo 和其他一些软件包 但是我不断收到错误 我是节点新手 所以我有点迷失 我运行的是 Mac OS X 10 10 3 我正在使用的命令是 sudo npm install global yo 这样做会给
  • 使用 mosca MQTT 的请求响应模式

    有没有办法使用 mosca MQTT 实现请求响应模式 以 检查客户端的回复 如果在预期时间内未收到预期回复 则重新发布 我相信这在 Mqtt 5 中是可能的 但截至目前 我必须使用 QoS 1 的 Mosca 代理 支持直到 Mqtt 3
  • 如何让我的云代码在我的 Worker dyno(而不是 Web dyno)上运行?

    我在heroku 上部署了一个解析服务器 我正在解析服务器上运行一些云代码 该代码需要几分钟才能运行 并且在 Web dyno 上运行时会导致 Heroku 出现超时错误 heroku router at error code H12 de
  • 获取telegram群组的所有用户

    我正在尝试获取电报组的所有用户 我看到方法 getChatAdministrators 但我认为 API 没有获取所有成员的方法 我正在使用nodejs的telegram bot api Telegram 机器人 API https cor
  • 在社交媒体上分享 Reactjs 链接时,react-helmet 中的元标记不显示

    我有一个在客户端运行reactjs的项目 在后端运行nodejs express 我实现了react helmet来更新索引之外的路线的标题和元标记 例如 用户查看帖子 viewpost q POSTID 然后客户做了一个GET reque
  • Sequelize WHEREsequelize.fn(...) AND some='something' 排序问题

    我有一个 Sequelize findOne 函数 它会选择给定点与多边形 col geom 相交且状态 active 的行 var point sequelize fn ST GeomFromText POINT lng lat 4326
  • 全局未在 ../node_modules/socket.io-parser/is-buffer.js 中定义

    预先感谢您帮助我 我正在尝试在我的一个角度组件中连接套接字 但在浏览器的控制台中它会抛出一个错误 指出 Global 未在 Object node modules socket io parser is buffer js 中定义 这是我的
  • 无法使用 webpack 加载 Node 原生插件

    虽然我正在使用vue cli在生成 webpack 配置的示例代码中 没有任何特定于 vue 的内容 我像这样创建示例应用程序 vue init webpack webpack modules example 生成webpack base
  • 如何获取knex / mysql中所有更新记录的列表

    这是我正在处理的查询 return knex table returning id where boolean false andWhere fooID foo id update boolean true limit num then f
  • 为什么我的 Mongoose 3.8.7 架构 getter 和 setter 被忽略?

    在使用 Node js Mongoose 和 MongoDB 时 我发现当我执行 findOne 查询时 我的 Mongoose 模式 getter 和 setter 不会触发 我发现一个旧线程表明 2 x 版本中的 getter 和 se
  • AWS Amazon - 登录循环卡住

    我已经使用 AWS 亚马逊几年了 但是 突然当我登录时 我进入了此验证部分 他们将验证码发送到我的电子邮件 我收到了该代码 因此 我输入收到的代码 最终返回登录页面 所以我登录后 同样的事情一遍又一遍地发生 我无法进入我的仪表板 它只是不断
  • at=错误代码=H12 desc=node.js中的请求超时。如何处理?

    2020 07 21T06 54 58 030920 00 00 heroku 路由器 at error code H12 gt desc Request timeout 方法 获取路径 食谱 主机 desolate beach 26163
  • Mongoose - 用其他 ID 填充

    我有这两个简化的模式 我想根据 IP 地址 加入 它们 var personSchema Schema name String ip String var logSchema Schema message String ip String
  • NodeJs 环境变量与配置文件

    实际上 我有一个 NodeJS Express 应用程序 其配置文件包含主机 端口 JWT 令牌 数据库参数等参数 问题是 将这些参数直接保留在环境变量上 没有任何配置文件 并访问它们 而不需要在所有组件和模块中进行 require 配置是
  • WCF WebHttp 混合身份验证(基本和匿名)

    所有这些都与 WebHttp 绑定有关 托管在自定义服务主机中 IIS 目前不是一个选项 我已经实现了自定义 UserNamePasswordValidator 和自定义 IAuthorizationPolicy 当我将端点的绑定配置为使用
  • 动态更改温斯顿的日志级别

    我尝试在运行时实现日志级别更改 我一直在关注https github com yannvr Winston dynamic loglevel blob master test https github com yannvr Winston
  • Node 不断恢复到旧版本

    每次我在控制台中重新启动 vagrant 时 它都会询问我的登录详细信息 然后说Now using node v7 10 0 npm v4 2 0 当我做run nvm install node I get v13 11 0 is alre
  • 如何使用 AMQP 以“PeekLock”模式从 Azure 服务总线队列获取消息?

    我们正在尝试在 Node 应用程序中使用 Azure 服务总线 我们的要求是从队列中获取多条消息 由于Azure SDK for Node不支持批量检索 我们决定使用AMQP 虽然我们能够使用 Peek Messages 获取消息 如此处所

随机推荐

  • 从列表中删除自定义单词 - Python

    我有一个数据框列 如下所示 我正在考虑删除特殊字符 我希望附加标签 在列表列表中 以便我可以将列附加到现有的 df 这是我收集了这么多 但似乎不起作用 正则表达式尤其给我带来了很大的痛苦 因为它总是返回 预期的字符串或类似字节的对象 df
  • LRPC 的意义何在?为什么有人想要对同一台机器进行远程过程调用?

    根据我对 RPC 远程过程调用 的理解 它们提供了一种向远程计算机发送函数调用 调用等的方法 这样做的明显优点是 您可以拥有一个在机器集群上运行的单个程序 并且可以处理更多请求 更多数据等 但我很困惑LRPC 轻量级RPC http www
  • 需要帮助调试缓慢的 scons 运行时

    我正在使用 scons 构建两个项目 一个项目效果很好 而另一个 更复杂 项目则非常令人沮丧 这是我在为第二个项目运行 scons 时看到的内容 S time scons scons Reading SConscript files lt
  • 在 OSX 上设置 PHPUnit

    尽管我确信其他人最终已经设法解决了这个问题 但我一直在关注各种文档 并且度过了一段艰难的时光 http www phpunit de manual current en installation html http www phpunit
  • 谷歌地图破坏 KML

    我已经创建了一些世界地区的 KML 文件 以便使用 Google 地图 API 进行显示 这一直工作正常 但最近有一个区域开始显示数据好像已损坏 你可以在这里明白我的意思 https drive google com file d 0B9u
  • jQuery 切换动画

    我有这个 jQuery document ready function panel hide login toggle function panel animate height 150 padding 20px 0 backgroundC
  • Bash 中常量的命名约定是什么?

    在 shell 脚本中 即使我使用Java or Python样式命名约定 我仍然不清楚命名常量 许多约定建议我使用 大写字母 和 下划线 一起命名常量 例如MY CONSTANT PI 但在Bash 这可能与环境变量 https stac
  • 使用 Yosup 时如何查找最新的 MD5、KEY 和 VERSION

    我发现在使用 yowsup 时出现 old version 错误时 向 Whatsapp 服务器注册有时会失败 Yosup 旧版本错误 https stackoverflow com questions 35877803 yowsup ol
  • GAE PHP 应用程序:无法找到包装器“gs”

    我正在编写一些非常简单的代码standardphp73 Google App 引擎环境 遵循此处的文档 https cloud google com appengine docs standard php googlestorage htt
  • Node-sass 不理解波浪号

    探索angular cli对于最近发布的 Angular2 的 RC1 我遇到了奇怪的问题 node sass在 sass 插件中angular cli不解析 在包名称之前抛出以下错误 Error File to import not fo
  • 非常简单的DNS服务器

    我有一台 Linux 服务器 有一个临时无线网络供客户端连接 连接后 我希望用户始终被重定向到它自己的 Web 服务器 无论他们输入什么 URL 最大的解决方案是设置一个完整的 DNS 服务器 使用 BIND 或等效服务器 但这似乎有点过头
  • QString 的运算符 <<

    为 QString 实现 std ostream operator lt lt std ostream stream const QString str stream lt lt str toAscii constData or strea
  • 浏览器也可以缓存嵌入的 Base64 图像吗?

    我想知道是否有任何现代浏览器实际上缓存了嵌入的图像 base64 字符串 这在不久的将来有可能吗 基于 W3C 或主要浏览器的官方文档 我不这么认为 因为你错过了Resource Identifier作为缓存图像的键 对于嵌入图像 您只有数
  • 使用 pandas 标记每组的每 N 行

    我有一个数据框 其中包含客户信息及其购买详细信息 我正在尝试添加一个新列 指示同一客户每进行第三次购买 下面给出的是数据框 customer name bill no date Mark 101 2018 10 01 Scott 102 2
  • input:not(:placeholder-shown) ~ 标签选择器不适用于自动填充

    我在输入字段中有浮动占位符 当我们未提供输入值时 占位符将出现在中心 如下图所示 电子邮件和密码为占位符 现在 当您向电子邮件提供值时 它确实如下所示 观察提供值后 电子邮件和密码已被提取 当浏览器开始从页面加载时保存的凭据 如用户名 电子
  • NSCalendar NSDateComponents weekofYear 返回 1,日期为 2014-12-31

    我想获得日期为 2014 12 31 的 weekofYear 但它总是返回 1 而不是 52 这是我的代码 NSCalendar calendar NSCalendar currentCalendar NSUInteger unitFla
  • 为什么 Google 的 pandas_datareader 不起作用?

    我尝试通过以下代码从谷歌财经获取数据 import pandas datareader data as wb import datetime as dt start dt datetime 2015 1 1 end dt datetime
  • nginx php 友好的 URL 重定向,不会干扰 index.php 导致 /index

    我尝试了很多不同的配置来启用任何以 php 结尾的请求的永久重定向 以重定向到不带 php 的自身 问题是 我无法获得将使用 index php 发送到任何目录的请求重定向到 而不是 index 的规则 Example 期望的行为 blog
  • 如何获取系统设备语言,swift iOS

    如何使用 swift iOS 获取系统设备语言 而不是应用程序语言 我没有遇到任何问题 我想从以下位置获取设备语言设置 gt 常规 gt 语言该用户将语言设置为 我尝试了下面的代码 let appLang Locale preferredL
  • 如何处理异步。护照和猫鼬的 findOrCreate 方法

    身份验证模块 Passport 需要 FindOrCreate 方法才能进行登录 我使用 mongoose 来保存我的用户 其架构如下 var UserSchema new Schema firstname String lastname