TypeError:req.session.regent不是使用Passport的函数



大家好,我正在学习React全web堆栈的Node课程,我遇到了一个大问题,我不知道它为什么会出现,也不知道它显示了什么。我的终端显示此错误:

req.session.regenerate(function(err) {
^ TypeError: req.session.regenerate is not a function

我的代码看起来像

index.js

const express = require("express");
const mongoose = require("mongoose"); 
const cookieSession = require("cookie-session");
const passport = require("passport"); 
const keys = require("./config/keys"); 
require("./models/User");
require("./services/passport");

mongoose.connect(keys.connect_url);
const app = express();
app.use(   cookieSession({
maxAge: 30 * 24 * 60 * 60 * 1000,
keys: [keys.cookieKey],   }) ); 
app.use(passport.initialize()); 
app.use(passport.session());
require("./routes/authRoutes")(app);

const PORT = process.env.PORT || 5000; 
app.listen(PORT);

passport.js

const passport = require("passport"); 
const GoogleStrategy = require("passport-google-oauth20").Strategy; 
const mongoose = require("mongoose");
const keys = require("../config/keys");

const User = mongoose.model("users");

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

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

passport.use(new GoogleStrategy(
{
clientID: keys.googleClientId,
clientSecret: keys.googleClientSecret,
callbackURL: "/auth/google/callback",
},
(accessToken, refreshToken, profile, done) => {
User.findOne({ googleId: profile.id }).then((existingUser) => {
if (existingUser) {
// we already have a record with the given profile ID
done(null, existingUser);
} else {
// we don't have a user record with this ID, make a new record!
new User({ googleId: profile.id })
.save()
.then((user) => done(null, user));
}
});
}   ) );

authRouters.js

const passport = require("passport");

module.exports = (app) => {
app.get(
"/auth/google",
passport.authenticate("google", {
scope: ["profile", "email"],
})
);

app.get("/auth/google/callback", passport.authenticate("google"));

app.get("/api/current_user", (req, res) => {
res.send(req.user);
});
};

我真的不知道这个问题会出现,我可以说,当我去localhost:5000/auth/google时,它就会出现

我在做同样的课程,在udemy上有修复程序。来自乌代米:

Passport v.0.6.0当前由于不兼容而损坏:https://github.com/jaredhanson/passport/issues/907

维护人员建议使用最新的v0.5.0,直到推出修复程序。用途:

npm卸载passport

npm安装passport@0.5

这对我来说很好。

https://github.com/jaredhanson/passport/issues/907

npm uninstall passport
npm install passport@0.5

我发现philippkrauss关于他建议的实现的帖子在使用passport 0.6.0时有效。

app.use(cookieSession({
// ...
}))
// register regenerate & save after the cookieSession middleware initialization
app.use(function(request, response, next) {
if (request.session && !request.session.regenerate) {
request.session.regenerate = (cb) => {
cb()
}
}
if (request.session && !request.session.save) {
request.session.save = (cb) => {
cb()
}
}
next()
})

我认为发生这个错误是因为passport内部使用了req.session.regenerate()函数(源代码链接),cookie-session没有regenerate方法,因此passport抛出了错误。

cookie-sessionGitHub页面上还有一个与regenerate功能相关的问题(问题链接)。

如果将会话保留在客户端并不重要,您可以将其保留在服务器端,您可以为此使用express会话,这样您就不会出现上述错误。

我也没多久就遇到了这个问题。。。cookie会话包似乎有问题。。。为了解决这个问题,我使用了快速会话

// install the package
npm install express-session
const session = require('express-session')
app.use(session({
secret: 'somethingsecretgoeshere',
resave: false,
saveUninitialized: true,
cookie: { secure: true }
}));

最新更新