我是node.js的新手,目前正在从事我的第一个项目。当使用passport.js进行OAuth时,它给了我
Error: passport.initialize() middleware not in use
at IncomingMessage.req.login.req.logIn (C:\Users\Rohit\Documents\Projects\server\node_modules\passport\lib\http\re
quest.js:46:34)
错误,即使我目前没有使用会话。但是,当我注释掉‘my ()’函数时,它就不再显示这个错误了。据我所知,只有在使用会话时,我才必须使用'passport.initialize()‘。有人能帮帮我吗?
index.js :-
const express = require('express');
const mongoose = require('mongoose');
const keys = require('./config/keys');
require('./models/User');
require('./services/passport');
const app = express();
mongoose.connect
(
keys.mongoURI,
{
useNewUrlParser : true,
useCreateIndex : true,
useUnifiedTopology : true,
}
)
.then(() => console.log('Mongoose connected ...'))
.catch(err => console.log(err));
require('./routes/authroutes')(app);
const PORT = process.env.PORT || 5000;
app.listen(PORT);
.:-
const passport = require('passport');
const GoogleStrategy = require('passport-google-oauth20').Strategy;
const keys = require('../config/keys');
const mongoose = require('mongoose');
const User = mongoose.model('users');
passport.use(
new GoogleStrategy
(
{
clientID : keys.googleClientID,
clientSecret : keys.googleClientSecret,
callbackURL : '/auth/google/callback'
},
(acessToken, refreshToken, profile, done) =>
{
//console.log(profile);
User.findOne({ googleID : profile.id})
.then(
(existingUser) =>
{
if(existingUser)
{
//there is already a user with this emailin our adatbase
console.log('User already exists!');
done(null, existingUser);
}
else
{
//NEW User
console.log('New User!\n');
new User({ googleID : profile.id})
.save()
.then
(
user => done(null, user)
);
}
}
);
}
)
);
谢谢!
发布于 2021-05-08 09:27:31
在基于连接或快捷的应用程序中,需要使用
()中间件来初始化Passport。如果应用程序使用持久登录会话,则还必须使用passport.session()中间件。
http://www.passportjs.org/docs/downloads/html/
passport.initialize()
是您应该使用的中间件,用于初始化Passport。这就是你所犯的错误。
在声明路由之前添加passport.initialize()
。
const express = require('express');
const mongoose = require('mongoose');
const passport = require('passport'); // Calling passport
const keys = require('./config/keys');
require('./models/User');
require('./services/passport'); // Calling the passport setup you've defined in passport.js
const app = express();
app.use(passport.initialize());
mongoose.connect
(
keys.mongoURI,
{
useNewUrlParser : true,
useCreateIndex : true,
useUnifiedTopology : true,
}
)
.then(() => console.log('Mongoose connected ...'))
.catch(err => console.log(err));
require('./routes/authroutes')(app);
const PORT = process.env.PORT || 5000;
app.listen(PORT);
参考:http://www.passportjs.org/docs/downloads/html/
如果使用会话,则需要在index.js文件中指定如下所示。
app.use(passport.initialize());
app.use(passport.session());
另外,将serializeUser
& deserializeUser
添加到护照设置( passport.js
文件)中。
const passport = require('passport');
const GoogleStrategy = require('passport-google-oauth20').Strategy;
const keys = require('../config/keys');
const mongoose = require('mongoose');
const User = mongoose.model('users');
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 GoogleStrategy
(
{
clientID : keys.googleClientID,
clientSecret : keys.googleClientSecret,
callbackURL : '/auth/google/callback'
},
(acessToken, refreshToken, profile, done) =>
{
//console.log(profile);
User.findOne({ googleID : profile.id})
.then(
(existingUser) =>
{
if(existingUser)
{
//there is already a user with this emailin our adatbase
console.log('User already exists!');
done(null, existingUser);
}
else
{
//NEW User
console.log('New User!\n');
new User({ googleID : profile.id})
.save()
.then
(
user => done(null, user)
);
}
}
);
}
)
);
根据命名约定,我建议您将passport.js
重命名为passport-setup.js
,因为这可能会导致混淆。而且,这也是一个很好的做法。
我希望这个答案对你有帮助。
谢谢。
https://stackoverflow.com/questions/67445623
复制相似问题