【问题标题】:How to pass multiple paramaters in Local Passport sessions?如何在本地护照会话中传递多个参数?
【发布时间】:2021-02-08 15:12:21
【问题描述】:

我正在尝试将 2 个从 Mongoose 返回的变量传递到“完成”字段以从 EJS 页面访问它。我让它使用 1 个变量,但 2 不起作用。我尝试将它包装在 JSON 中,但它仍然无法正常工作。有什么帮助吗?

我尝试了 2 个变量的代码:

passport.serializeUser((user, done) => {
    done(null, user.id)
})
passport.deserializeUser((id, done) => {
    User.findById(id, (err, user) => {
        Products.find({ OwnerEmail: user.email }).then((products) => {
            done(err, {user: user, products: products})
        })
    })
})

有效的代码(1 个变量):

passport.serializeUser((user, done) => {
    done(null, user.id)
})
passport.deserializeUser((id, done) => {
    User.findById(id, (err, user) => {
        done(err, user)
    })
})

我对护照还很陌生。

【问题讨论】:

  • 欢迎来到 SO,当你说它不起作用时......它到底是什么意思?你有任何错误吗?如果是这样,错误说明了什么?您在问题中提供的信息越多,从社区获得答案和帮助的机会就越大

标签: express passport.js ejs


【解决方案1】:

注意passport.deserializeUser 会将传递的对象添加到req.user 属性中。这意味着在访问 EJS 模板渲染的对象时,您需要遍历 req.user 以获取预期值。

ejs.render(file, { user: req.user.user, products: req.user.products });

要清理嵌套属性,我可以尝试使用扩展语法。

只是一个例子:

// passport.deserializeUser
done(err, { ...user, products: products})


// Render Call
// Extract out just user data into user variable.
const user = (({ products, ...others }) => others)(req.user);
ejs.render(file, { user, products: req.user.products });

【讨论】:

  • 可能应该补充说这是在路由器中进行身份验证的。我应该在哪里添加渲染线?登录路径:router.post('/login', (req, res, next) => { passport.authenticate('local', { successRedirect: "/dashboard", failureRedirect: '/users/login', failureFlash: true })(req,res,next) })
  • 对我来说没问题。因此,在您完成对login 的 POST 和护照呼叫deserializeUser 之后,您将可以通过req.user 访问任何路线上的所有数据。因此,您可以将 ejs 渲染合并到您的 /dashboard 路由或您希望从数据库中访问数据的任何地方。
  • 在浏览了我的代码一段时间后,我意识到我并没有将新的 req.user.user 和 req.user.products 传递到仪表板,而是试图用护照返回它。感谢您的帮助,我一定会将您的问题标记为解决方案。
猜你喜欢
  • 2019-06-23
  • 2014-03-29
  • 1970-01-01
  • 1970-01-01
  • 2017-03-07
  • 1970-01-01
  • 2018-05-26
  • 2018-10-24
  • 1970-01-01
相关资源
最近更新 更多