簡體   English   中英

JS promise。一些 node.js 和護照 js。 如何從 promise {{}} 獲取內部結構? 請求用戶

[英]JS promise. Some node js and passport js. How can I get an internal structure from promise { {} }? req.user

我無法從 req.user 獲取項目,當我嘗試查看 req.user 中的內容時,它顯示:

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

原來我可以 output 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

編輯:看到你的策略后,我可以看到問題出在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解決 promise 問題,您最終會得到 req.user 的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
  }
));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM