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.jsapp 变量。您不能在 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() 中间件未使用

护照中间件不运行

什么是passport.initialize()? (nodejs快递)

NodeJS Passport按路由配置,作为中间件添加并且没有错误但它不起作用/触发

护照认证回调挂起