joshk132
joshk132

Reputation: 1103

Error: passport.initialize() middleware not in use | creates user in database but give this error

I am trying to sign a user up to my application, when I do so it gives me the error in the console of Error: passport.initialize() middleware not in use but I do have passport initialized. It does create the user in the database correctly though. It just seems like the initial passport setup is wrong.

I have included what I think are the important parts of the application to explain what is happening. I included a comment down at the line that the stack trace points to.

App.js

app.use(session({
    secret: config.sessionSecret,
    // create new redis store.
    store: new RedisStore({ host: 'localhost', port: 6379, client: client, auto_reconnect: true}),
    saveUninitialized: false,
    resave: false,
    cookie: {
        maxAge: 60 * 1000 * 60 * 24 * 30 // 30 days
    },
}));

// PASSPORT CONFIGURATION
require('./controllers/passport')(passport);
app.use(passport.initialize());
app.use(passport.session());

// Routes
require('./routes/index.js')(app, passport);

controllers/passport.js

passport.use('signup', new LocalStrategy({
      usernameField: 'email',
      passReqToCallback : true
    },
    function(req, email, password, done) {
        User.findOne({ email: req.body.email }, function(err, existingUser) {
          if(err){
            console.log(err);
          }
          if (existingUser) {
            req.flash('form', {
              email: req.body.email
            });
            return done(null, false, req.flash('error', 'An account with that email address already exists.'));
          }

          var user = new User({
            email: req.body.email,
            password: req.body.password 
          });

          user.save(function(err) {
            if (err) return done(err, false, req.flash('error', 'Error saving user.'));

            var token = new Token({ _userId: user._id, token: crypto.randomBytes(16).toString('hex') });
            token.save(function (err) {
            if (err) return done(null, false, req.flash('error', err.message));
            var email = req.body.email;
            // Send the email for the token
            var message = 'Hello,\n\n' + 'Please verify your account by clicking the link: \nhttp:\/\/' + req.headers.host + '\/confirmation\/' + token.token + '\/' + email + '\n';
            sendEmail('"APPNme" [email protected]', user.email, 'Account Verification Token', message);
            });
            var time = 14 * 24 * 3600000;
            req.session.cookie.maxAge = time; //2 weeks
            req.session.cookie.expires = new Date(Date.now() + time);
            req.session.touch();
            return done(null, user, req.flash('success', 'A verification email has been sent to ' + user.email + '.')); // stack trace points to this line as the error line. 
          });
        });

    })
  );

routes/index.js

app.post('/signup', passport.authenticate('signup', {
    successRedirect : '/profile', section
    failureRedirect : '/signup',
    failureFlash : true 
}));

Upvotes: 1

Views: 202

Answers (1)

Aritra Chakraborty
Aritra Chakraborty

Reputation: 12552

You need to add passport.initialize middleware.
Refer: https://scotch.io/tutorials/easy-node-authentication-setup-and-local

// required for passport
app.use(session({ secret: 'ilovescotchscotchyscotchscotch' })); // session secret
app.use(passport.initialize());
app.use(passport.session()); // persistent login sessions

The order needs to be maintained:

Docs

  • bodyParser
  • express session
  • require passport.js
  • passport.initialize
  • passport.session
  • require routes

Upvotes: 1

Related Questions