passport.initialize() 中间件未使用
Posted
技术标签:
【中文标题】passport.initialize() 中间件未使用【英文标题】:passport.initialize() middleware not in use 【发布时间】:2021-08-25 08:22:54 【问题描述】:我在我的项目中使用节点、快递、猫鼬和护照,并且我在我的代码中实现了一个简单的登录功能,如下面的 app.js 所示,它运行良好。然后我尝试拆分我的代码,因为我想使用 MVC,这一次当我运行我的应用程序并尝试登录时,我得到了 错误。我已经尝试了其他帖子中其他用户建议的所有内容,但无济于事。有什么建议吗?
app.js - 可以使用的旧版本
const express = require('express');
const morgan = require('morgan');
const mongoose = require('mongoose');
const Donation = require('./models/Donation');
const User = require('./models/User');
const donationRoutes = require('./routes/donationRoutes');
const registerRoutes = require('./routes/registerRoutes');
// express app
const app = express();
// connect to mongodb & listen for requests
const dbURI = "mongodb+srv://test:test@test.8npff.mongodb.net/test?retryWrites=true&w=majority";
mongoose.connect(dbURI, useNewUrlParser: true, useUnifiedTopology: true )
.then(result => app.listen(3000))
.catch(err => console.log(err));
// register view engine
app.set('view engine', 'ejs');
// middleware & static files
app.use(express.static('public'));
app.use(express.urlencoded( extended: true ));
app.use(morgan('dev'));
app.use((req, res, next) =>
res.locals.path = req.path;
next();
);
// express setup for login
const bodyParser = require('body-parser');
const expressSession = require('express-session')(
secret: 'secret',
resave: false,
saveUninitialized: false
);
app.use(bodyParser.json());
app.use(bodyParser.urlencoded( extended: true ));
app.use(expressSession);
// passport setup for auth login
const passport = require('passport');
app.use(passport.initialize());
app.use(passport.session());
// passport local authentification
passport.use(User.createStrategy());
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
/* LOGIN ROUTES */
const connectEnsureLogin = require('connect-ensure-login');
app.post('/login', (req, res, next) =>
passport.authenticate('local',
(err, user, info) =>
if (err)
return next(err);
if (!user)
return res.redirect('/login?info=' + info);
req.logIn(user, function(err)
if (err)
return next(err);
return res.redirect('/');
);
)(req, res, next);
);
app.get('/login',
(req, res) => res.render('login', title: 'login')
);
app.get('/donations',
connectEnsureLogin.ensureLoggedIn(),
(req, res) =>
Donation.find().sort( createdAt: -1 )
.then(result =>
res.render('donations/index', donations: result, title: 'All Donations' );
)
.catch(err =>
console.log(err);
);
);
app.get('/user',
connectEnsureLogin.ensureLoggedIn(),
(req, res) => res.send(user: req.user)
);
app.get('/logout', function(req, res)
req.logout();
res.redirect('/');
);
//Register Routes
app.use('/', registerRoutes);
// *** routes ***
app.get('/', (req, res) =>
res.redirect('/donations');
);
//donation routes
app.use('/donations', donationRoutes);
// 404 page
app.use((req, res) =>
res.status(404).render('404', title: '404' );
);
app.js - 新的
const express = require('express');
const morgan = require('morgan');
const mongoose = require('mongoose');
const donationRoutes = require('./routes/donationRoutes');
const registerRoutes = require('./routes/registerRoutes');
const loginRoutes = require('./routes/loginRoutes');
// express app
const app = express();
// connect to mongodb & listen for requests
const dbURI = "mongodb+srv://test:test@test.8npff.mongodb.net/test?retryWrites=true&w=majority";
mongoose.connect(dbURI, useNewUrlParser: true, useUnifiedTopology: true )
.then(result => app.listen(3000))
.catch(err => console.log(err));
// register view engine
app.set('view engine', 'ejs');
// middleware & static files
app.use(express.static('public'));
app.use(express.urlencoded( extended: true ));
app.use(morgan('dev'));
app.use((req, res, next) =>
res.locals.path = req.path;
next();
);
//Register Routes
app.use('/', registerRoutes);
//Login Routes
app.use('/', loginRoutes);
// *** routes ***
app.get('/', (req, res) =>
res.redirect('/donations');
);
//donation routes
app.use('/donations', donationRoutes);
// 404 page
app.use((req, res) =>
res.status(404).render('404', title: '404' );
);
loginController.js
const connectEnsureLogin = require('connect-ensure-login');
const Donation = require('../models/Donation');
const express = require('express');
const User = require('../models/User');
// express app
const app = express();
// express setup for login
const bodyParser = require('body-parser');
const expressSession = require('express-session')(
secret: 'secret',
resave: false,
saveUninitialized: false
);
app.use(bodyParser.json());
app.use(bodyParser.urlencoded( extended: true ));
app.use(expressSession);
// passport setup for auth login
const passport = require('passport');
app.use(passport.initialize());
app.use(passport.session());
// passport local authentification
passport.use(User.createStrategy());
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
const login_post = (req, res, next) =>
passport.authenticate('local',
(err, user, info) =>
if (err)
return next(err);
if (!user)
return res.redirect('/login?info=' + info);
req.logIn(user, function(err)
if (err)
return next(err);
return res.redirect('/');
);
)(req, res, next);
const login_get = (req, res) =>
res.render('login', title: 'login');
const index_get = (req, res) =>
connectEnsureLogin.ensureLoggedIn();
Donation.find().sort( createdAt: -1 )
.then(result =>
res.render('donations/index', donations: result, title: 'All Donations' );
)
.catch(err =>
console.log(err);
);
const user_get = (req, res) =>
connectEnsureLogin.ensureLoggedIn();
res.send(user: req.user);
const logout_get = (req, res) =>
req.logout();
res.redirect('/')
module.exports =
login_post,
login_get,
index_get,
user_get,
logout_get
loginRoutes.js
const express = require('express');
const loginController = require('../controllers/loginController');
const router = express.Router();
router.post('/login', loginController.login_post);
router.get('/login', loginController.login_get);
router.get('/donations', loginController.index_get);
router.get('/user', loginController.user_get);
router.get('/logout', loginController.logout_get);
module.exports = router;
这是错误日志:
Error: passport.initialize() middleware not in use
at IncomingMessage.req.login.req.logIn (C:\Users\123\Documents\Datenbanken_Projekt\transparent_blood\node_modules\passport\lib\http\request.js:46:34)
at C:\Users\123\Documents\Datenbanken_Projekt\transparent_blood\controllers\loginController.js:43:9
at Strategy.strategy.success (C:\Users\123\Documents\Datenbanken_Projekt\transparent_blood\node_modules\passport\lib\middleware\authenticate.js:219:18)
at verified (C:\Users\123\Documents\Datenbanken_Projekt\transparent_blood\node_modules\passport-local\lib\strategy.js:83:10)
at C:\Users\123\Documents\Datenbanken_Projekt\transparent_blood\node_modules\passport-local-mongoose\index.js:205:41
【问题讨论】:
您必须重用来自app.js
的app
变量。您不能在 loginController.js
中创建另一个快速应用程序,这是错误的。
【参考方案1】:
这里有两个问题:
您不止一次创建新的app
。首先是app.js
,然后是loginController.js
。您应该只使用一个应用实例,否则它就像第二台服务器,您的中间件将无法正常工作。
在您的示例中,您从不初始化护照(使用passport.initialize()
)。在第一个示例(正在工作)中,护照初始化有很多行,包括策略和东西——// passport setup for auth login
之后的所有内容。然后他们走了。你需要把它们带回来;)
【讨论】:
我不小心将 app.js 代码也粘贴到了 loginController.js 中。我现在添加了正确的代码,但我仍然在那里创建了一个新应用程序。由于我是 node 和 express 的新手,我没有考虑我应该只有一个实例的事实。关于如何导出应用程序以在 loginController 中使用它的任何提示? 您通常只有一个app.js
文件,用于初始化应用程序并添加路由。在路由处理程序中,您使用控制器(并且您不修改应用程序本身)。您只需使用路由器(可以在任何地方重复使用)。所以在你的控制器上,你应该只有请求处理程序(从login_post
开始)。我认为这已经足够了:)以上是关于passport.initialize() 中间件未使用的主要内容,如果未能解决你的问题,请参考以下文章
错误:passport.initialize() 中间件未使用 以啥顺序进行调用?
什么是passport.initialize()? (nodejs快递)