Node.js 您好,在为OAuth使用passport.js时,我发现中间件没有被使用,即使我没有使用会话

Node.js 您好,在为OAuth使用passport.js时,我发现中间件没有被使用,即使我没有使用会话,node.js,express,passport.js,Node.js,Express,Passport.js,我是node.js的新手,目前正在做我的第一个项目。 在为OAuth使用passport.js时,它给了我 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) 错误,即使我目前没

我是node.js的新手,目前正在做我的第一个项目。 在为OAuth使用passport.js时,它给了我

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)
错误,即使我目前没有使用会话。但当我注释掉我的'done()'函数时,它将停止显示此错误。据我所知,只有在使用会话时,我才必须使用“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);
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.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)
                  );
              }
            }
        );
    }
  )
);
谢谢大家!

在基于Connect或Express的应用程序中,passport.initialize() 初始化Passport需要中间件。如果你的申请 使用持久登录会话,passport.session()中间件必须 也可以使用

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);
参考:

如果您正在使用会话,则需要在index.js文件中指定如下所示

app.use(passport.initialize());
app.use(passport.session());
另外,将
serializeUser
反序列化user
添加到passport设置(您的
passport.js
文件)

根据命名约定,我建议您将
passport.js
重命名为
passport setup.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)
                  );
              }
            }
        );
    }
  )
);