【问题标题】:JS promise. Some node js and passport js. How can I get an internal structure from promise { {} }? req.userJS 承诺。一些节点js和护照js。如何从 Promise { {} } 中获取内部结构?请求用户
【发布时间】:2021-10-07 06:42:31
【问题描述】:

我无法从 req.user 获取项目,当我尝试查看 req.user 中的内容时,它显示:

Promise {
  {
    login: 'login',
    password: '$2b$10$sivL/8KvPYzlN/b24nWNOOa7pd02WX',
    id: 12,
    role: 'user'
  }
}

原来我可以输出Promise { {} },但我只需要内部结构,如何获取它进行进一步处理(仅以角色为例)?

req.user 在那里设置(根据指南)

const LocalStrategy = require('passport-local').Strategy
const bcrypt = require('bcrypt')

function initialize(passport, getUserByEmail, getUserById) {
  const authenticateUser = async (email, password, done) => {
    const user = await getUserByEmail(email)
    if (user == null) {
      return done(null, false, { message: 'No user with that email' })
    }

    try {
      if (await bcrypt.compare(password, user.password)) {
        return done(null, user)
      } else {
        return done(null, false, { message: 'Password incorrect' })
      }
    } catch (e) {
      return done(e)
    }
  }

  passport.use(new LocalStrategy({ usernameField: 'email' }, authenticateUser))
  passport.serializeUser((user, done) => done(null, user.id))
  passport.deserializeUser((id, done) => {
    return done(null, getUserById(id))
  })
}

module.exports = initialize

【问题讨论】:

  • 你应该解决promise,而不是尝试直接从中提取数据。
  • 可以把设置req.user的登录功能贴出来吗?您应该在那里解决承诺并使用结果设置req.user
  • 您不应该查看 Promise 的内部结构——它们的内部结构是故意保密的。如果你想要一个 promise 的解析值,你可以在 promise 上使用 .then()await 并以这种方式获得解析值。如果您显示该对象的来源(首先如何将其分配给req.user),人们可以更具体地为您提供帮助。这可能是代码需要修改的地方。
  • @coagmano 已编辑
  • @n33t 谢谢。原来我的第一个猜测是错误的,所以我编辑了我的答案

标签: javascript node.js passport.js


【解决方案1】:

编辑:看到您的策略后,我可以看到问题出在deserializeUser。看起来getUserById返回了一个promise,所以你需要先得到结果:

  passport.deserializeUser(async (id, done) => {
    const user = await getUserById(id);
    return done(null, user);
  })

以前的答案,以防它帮助别人:

您的问题很可能出在您的登录策略上,而不是您想使用req.user 的地方。

假设您使用 LocalStrategy 作为护照,您会在回调中返回最终解析的用户记录,如下所示:

passport.use(new LocalStrategy(
  function(username, password, done) {
    // Example service returning a promise
    UserService.loginWithPassword({ username, password }.then((user) => {
      if (!user) return done(null, false);
      return done(null, user);
    }).catch(error => {
      return done(err);
    });
  }
));

如果您不使用awaitthen 解决承诺,您最终会得到req.user 的承诺,就像您在问题中所说的那样:

passport.use(new LocalStrategy(
  function(username, password, done) {
    // Example service returning a promise
    const user = UserService.loginWithPassword({ username, password });
    // user will always be a promise here
    if (!user) return done(null, false);
    return done(null, user);
    // now `req.user` is the promise, instead of the user object
  }
));

【讨论】:

  • 非常感谢,它有效
  • @n33t 很高兴为您提供帮助。欢迎来到 StackOverflow!当您在这里时,我鼓励您使用tour of the site 并阅读how to ask good questions
  • 再次感谢,我一定会通过的:)
猜你喜欢
  • 2021-07-25
  • 2018-09-26
  • 2017-08-18
  • 1970-01-01
  • 2019-10-10
  • 2020-02-13
  • 1970-01-01
  • 2016-09-08
  • 1970-01-01
相关资源
最近更新 更多