【问题标题】:How do I get current session's username using Passport.js?如何使用 Passport.js 获取当前会话的用户名?
【发布时间】:2017-12-10 10:23:26
【问题描述】:

如何在我已经可以通过routes.js 访问的路由users.js 中使用Passport 的{user} 参数?

情况是我需要访问多个新路由文件中的 Passport 参数,因此我不必将用户 routes.js 作为包含我的所有应用程序路由的唯一文件。

app.js - 我只隔离感兴趣的部分

const express = require('express')
const session = require('express-session')
const cookieParser = require('cookie-parser')
const bodyParser = require('body-parser')
const passport = require('passport')
const flash = require('connect-flash')

const app = express()

app.use(session({
    secret: 'stackoverflow',
    resave: true,
    saveUninitialized: true,
})) 
app.use(passport.initialize())
app.use(passport.session()) 
app.use(flash()) 

const index = require('./routes/index')
const users = require('./routes/users')

require('./config/passport')(passport)

// I believe that (app, passport) enables the routes.js to have access to {user} parameter
require('./routes/routes.js')(app, passport) 
// load  routes and pass in our app and fully configured passport

app.use('/', index)
app.use('/users', users)

module.exports = app;

functions.js - 我的全局函数文件

const express = require('express')
const router = express.Router()
const db = require('../db/Conf')

module.exports.isLoggedIn = function isLoggedIn(req, res, next) {
    if (req.isAuthenticated()) return next()
    res.redirect('/notloggedin')
}

module.exports.fdb = function fdb(mypar, callback) {
    // some stuff for querying
}

routes.js - 这里{user} 参数输出它的值没有问题

const fcs = require('../routes/functions')
module.exports = (app, passport) => {

    app.get('/login', (req, res) => {
        res.render('login.ejs', { message: req.flash('loginMessage') })
    });

    app.post('/login', passport.authenticate('local-login', {
        //login stuff
    });

    app.get('/profile', fcs.isLoggedIn, ({ user }, res) => {
        res.render('profile.ejs', {user})

        // gets the user out of session and pass to template which is OK
        console.log('User is: ', user.username) 
    });
};

users.js -> 我希望能够使用 Passport 的 {user} 参数的路由,我已经可以在 routes.js 中获得该参数

const express = require('express')
const router = express.Router()
const db = require('../db/Conf')
const fcs = require('../routes/functions')

router.get('/', fcs.isLoggedIn, function(req, res, {user}) {
    // some mysql querying stuff using my function fcs.fdb

    res.render('users')

    // Undefined -> Trying to get the {user} value through Passport
    console.log(user.username)

})

module.exports = router

基于https://github.com/RosieCode95/node-express-passport-mysql

【问题讨论】:

    标签: javascript node.js routes passport.js passport-local


    【解决方案1】:

    您只需使用req.user.username 而不是user.username 即可访问当前会话的 Passport.js 用户名值。

    此外,您的router.get 函数(users.js 路由文件)中不需要{user} 参数。

    router.get('/', fcs.isLoggedIn, function(req, res) {
    
        res.render('users')
        console.log(req.user.username)
    
    })
    

    【讨论】:

      【解决方案2】:

      试试const router = express.Router({mergeParams: true});。在 express 中,默认情况下您无法访问父级的路由参数。

      【讨论】:

      • 我在users.js上应用了,还是不行。实际上它现在甚至无法渲染页面users
      猜你喜欢
      • 2020-12-31
      • 1970-01-01
      • 1970-01-01
      • 2014-04-02
      • 2016-10-20
      • 1970-01-01
      • 1970-01-01
      • 2011-03-12
      • 2013-08-24
      相关资源
      最近更新 更多