Express 如何在本地Passport会话中传递多个参数?

Express 如何在本地Passport会话中传递多个参数?,express,passport.js,ejs,Express,Passport.js,Ejs,我试图将Mongoose返回的2个变量传递到“done”字段,以便从EJS页面访问它。我让它使用1个变量,但2不起作用。我试着用JSON来包装它,但仍然不起作用。有什么帮助吗 我尝试使用两个变量的代码: passport.serializeUser((user, done) => { done(null, user.id) }) passport.deserializeUser((id, done) => { User.findById(id, (err, user)

我试图将Mongoose返回的2个变量传递到“done”字段,以便从EJS页面访问它。我让它使用1个变量,但2不起作用。我试着用JSON来包装它,但仍然不起作用。有什么帮助吗

我尝试使用两个变量的代码:

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很陌生。

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

ejs.render(文件,{user:req.user.user,products:req.user.products});
为了清理嵌套属性,我可以尝试使用扩展语法

举个例子:

//passport.deserializeUser
完成(错误,{…用户,产品:产品})
//渲染调用
//将用户数据提取到用户变量中。
const user=({products,…others})=>others)(请求用户);
render(文件,{user,products:req.user.products});

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

ejs.render(文件,{user:req.user.user,products:req.user.products});
为了清理嵌套属性,我可以尝试使用扩展语法

举个例子:

//passport.deserializeUser
完成(错误,{…用户,产品:产品})
//渲染调用
//将用户数据提取到用户变量中。
const user=({products,…others})=>others)(请求用户);
render(文件,{user,products:req.user.products});

欢迎使用SO,当你说它不起作用时……它到底是什么意思?你有什么错误吗?如果是,错误说明了什么?你在问题中提供的信息越多,就越有机会从社区获得答案和帮助欢迎来到这里,当你说它不起作用时…它到底是什么意思?你有什么错误吗?如果是,错误说明了什么?您在问题中提供的信息越多,就越有机会从社区获得答案和帮助。您可能应该补充一点,这是在路由器中验证的。我应该在哪里添加渲染线?登录路径:
router.post('/Login',(req,res,next)=>{passport.authenticate('local',{successRedirect:“/dashboard',failureRedirect:'/users/Login',failureFlash:true})(req,res,next)}
我觉得还可以。因此,在您完成登录和passport调用后,您可以通过
req.user
访问任何路由上的所有数据。因此,您可以将ejs呈现合并到您的
/dashboard
路径中,或者您希望从数据库访问数据的任何位置。在查看了我的代码一段时间后,我意识到我没有将新的req.user.user和req.user.products传递到仪表板,而不是尝试使用passport返回它。谢谢你的帮助,我肯定会记下你关于解决方案的问题。可能应该补充一点,这是在路由器中验证的。我应该在哪里添加渲染线?登录路径:
router.post('/Login',(req,res,next)=>{passport.authenticate('local',{successRedirect:“/dashboard',failureRedirect:'/users/Login',failureFlash:true})(req,res,next)}
我觉得还可以。因此,在您完成登录和passport调用后,您可以通过
req.user
访问任何路由上的所有数据。因此,您可以将ejs呈现合并到您的
/dashboard
路径中,或者您希望从数据库访问数据的任何位置。在查看了我的代码一段时间后,我意识到我没有将新的req.user.user和req.user.products传递到仪表板,而不是尝试使用passport返回它。谢谢你的帮助,我肯定会记下你的问题的解决办法。
passport.serializeUser((user, done) => {
    done(null, user.id)
})
passport.deserializeUser((id, done) => {
    User.findById(id, (err, user) => {
        done(err, user)
    })
})