Javascript Passport Express中的会话不持久

Javascript Passport Express中的会话不持久,javascript,node.js,express,passport.js,Javascript,Node.js,Express,Passport.js,我已经看到了其他职位与完全相同的标题,但没有一个已经解决了我的问题。当用户登录时,它会短暂地抓取用户对象,然后将其放置在下一次渲染中。我现在在后台做这一切,所以问题就在那里。我已经确定了正确的进口顺序。这是相关代码 const express = require('express'); const app = express(); const bodyParser = require('body-parser'); const cors = require('cors'); const mong

我已经看到了其他职位与完全相同的标题,但没有一个已经解决了我的问题。当用户登录时,它会短暂地抓取用户对象,然后将其放置在下一次渲染中。我现在在后台做这一切,所以问题就在那里。我已经确定了正确的进口顺序。这是相关代码

const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const cors = require('cors');
const mongoose = require('mongoose');
const passport = require("passport");
var passportGithub = require('./auth/github')
const KBRoutes = express.Router();
const PORT = 4000;
let KB = require('./models/kb')
let Tags = require('./models/tags')
let User = require('./models/user')
const session = require('express-session')
mongoose.connect(process.env.MONGODB_URI || 'mongodb://127.0.0.1:27017/kb', { useNewUrlParser: true });
const connection = mongoose.connection;
app.use(cors());
app.use(bodyParser.json());


app.use(
    session({
        secret: process.env.APP_SECRET || 'this is the default passphrase',

    })
)
app.use(passport.initialize())
app.use(passport.session()) 

KBRoutes.get('/auth/github', passport.authenticate("github"));
KBRoutes.get(
    "/auth/github/callback",
    passport.authenticate("github", {
        failureRedirect: "/auth/login/failed"
    }),
    function (req, res) {
        var token = req.user.id;
        res.redirect("http://localhost:3111?token=" + token);
    },
);
app.use(function (req, res, next) {
    console.log('===== passport user =======')
    console.log(req.session)
    console.log(req.user)
    console.log('===== END =======')
    next()
})

init.js

var passport = require('passport');
var User = require('../models/user');


module.exports = function () {
    passport.serializeUser(function (user, done) {
        done(null, user.id);
    });

    passport.deserializeUser(function (id, done) {
        User.findById(id, function (err, user) {
            done(err, user);
        });
    });

};
策略

var passport = require('passport');
var GitHubStrategy = require('passport-github2').Strategy;

var User = require('../models/user');
var config = require('../_config');
var init = require('./init');

passport.use(new GitHubStrategy({
    clientID: config.github.clientID,
    clientSecret: config.github.clientSecret,
    callbackURL: config.github.callbackURL
},
    function (accessToken, refreshToken, profile, done) {
        var searchQuery = {
            name: profile.username
        };

        var updates = {
            name: profile.username,
            someID: profile.id
        };

        var options = {
            upsert: true
        };

        // update the user if s/he exists or add a new user
        User.findOneAndUpdate(searchQuery, updates, options, function (err, user) {
            if (err) {
                return done(err);
            } else {
                console.log(user)
                return done(null, user);
            }
        });
    }

));

// serialize user into the session
init();


module.exports = passport;

编辑:会话正在丢失数据,并且在序列化之后req.user变得未定义。在此之前的一切都有效

我认为这是因为有多个
passport
的实例可能使应用程序陷入混乱。我会删除init.js文件并将其集成到
策略
文件中,如下所示:

var passport = require('passport');
var GitHubStrategy = require('passport-github2').Strategy;

var User = require('../models/user');
var config = require('../_config');

passport.serializeUser(function (user, done) {
    done(null, user.id);
});

passport.deserializeUser(function (id, done) {
    User.findById(id, function (err, user) {
        done(err, user);
    });
});
passport.use(new GitHubStrategy({
    clientID: config.github.clientID,
    clientSecret: config.github.clientSecret,
    callbackURL: config.github.callbackURL
},
    function (accessToken, refreshToken, profile, done) {
        var searchQuery = {
            name: profile.username
        };

        var updates = {
            name: profile.username,
            someID: profile.id
        };

        var options = {
            upsert: true
        };

        // update the user if s/he exists or add a new user
        User.findOneAndUpdate(searchQuery, updates, options, function (err, user) {
            if (err) {
                return done(err);
            } else {
                console.log(user)
                return done(null, user);
            }
        });
    }

));

module.exports = passport;

同样的结果。它最初存储,然后立即下降。