【问题标题】:passport.initialize() middleware not in usepassport.initialize() 中间件未使用
【发布时间】:2021-08-25 08:22:54
【问题描述】:

我在我的项目中使用节点、快递、猫鼬和护照,并且我在我的代码中实现了一个简单的登录功能,如下面的 app.js 所示,它运行良好。然后我尝试拆分我的代码,因为我想使用 MVC,这一次当我运行我的应用程序并尝试登录时,我得到了 passport.initialize() 中间件未使用错误。我已经尝试了其他帖子中其他用户建议的所有内容,但无济于事。有什么建议吗?

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 中创建另一个快速应用程序,这是错误的。

标签: javascript node.js express mongoose passport.js


【解决方案1】:

这里有两个问题:

  1. 您不止一次创建新的app。首先是app.js,然后是loginController.js。您应该只使用一个应用实例,否则它就像第二台服务器,您的中间件将无法正常工作。

  2. 在您的示例中,您从不初始化护照(使用passport.initialize())。在第一个示例(正在工作)中,护照初始化有很多行,包括策略和东西——// passport setup for auth login 之后的所有内容。然后他们走了。你需要把它们带回来;)

【讨论】:

  • 我不小心将 app.js 代码也粘贴到了 loginController.js 中。我现在添加了正确的代码,但我仍然在那里创建了一个新应用程序。由于我是 node 和 express 的新手,我没有考虑我应该只有一个实例的事实。关于如何导出应用程序以在 loginController 中使用它的任何提示?
  • 您通常只有一个app.js 文件,用于初始化应用程序并添加路由。在路由处理程序中,您使用控制器(并且您不修改应用程序本身)。您只需使用路由器(可以在任何地方重复使用)。所以在你的控制器上,你应该只有请求处理程序(从login_post 开始)。我认为这已经足够了:)
猜你喜欢
  • 2013-05-22
  • 2019-12-26
  • 2018-08-25
  • 2019-01-26
  • 2018-07-04
  • 2016-01-01
  • 1970-01-01
  • 2019-10-28
  • 2018-03-20
相关资源
最近更新 更多