title: ReferenceError: user is not defined at Function.module.exports.getUserById passportjs
body: <p>I believe I have everything setup for passport to work but I am getting an error defined User error when I login.</p>
  
  <p>Here is my code so far:</p>
  
  <p>user.js model</p>
  
  <pre><code>const express = require('express');
  const mongoose = require('mongoose');
  const bcrypt = require('bcryptjs');
  
  var app = express();
  
  if (app.get('env') === 'production') {
    mongoose.connect(process.env.DATABASE_URL);
  } else {
    mongoose.connect('mongodb://localhost/pol-development');
  }
  
  var db = mongoose.connection;
  
  db.on('error', console.error.bind(console, 'connection error:'));
  db.once('open', function() {
    console.log("Connection has been established");
  });
  
  var UserSchema = mongoose.Schema({
    schoolName: String,
    schoolAddress: String,
    schoolAddress2: String,
    city: String,
    zipCode: String,
    addressCheck: Boolean,
    postalAddress: String,
    postalCity: String,
    postalZipCode: String,
    telephone: Number,
    fax: Number,
    email: String,
    password: String,
    schoolType: String,
    schoolDistrict: String,
    schoolRegion: String,
    curriculum: String,
    participationBefore: Boolean,
    participationYears: Number,
    directorName: String,
    directorTelephone: Number,
    directorEmail: String,
    directorAttendanceRehersal: Boolean,
    directorAttendanceEvent: Boolean,
    schoolLiaisonName: String,
    schoolLiaisonTelephone: Number,
    schoolLiaisonEmail: String,
    schoolLiaisonPosition: String,
    schoolLiaisonOtherPosition: String,
    schoolLiaisonTShirt: String,
    schoolLiaisonTutorMentor: String,
    attendanceRehersal: Boolean,
    attendanceEvent: Boolean
  });
  
  var User = module.exports = mongoose.model('User', UserSchema);
  
  module.exports.createUser = function(newUser, callback){
    bcrypt.genSalt(10, function(err, salt) {
      bcrypt.hash(newUser.password, salt, function(err, hash) {
        newUser.password = hash;
        newUser.save(callback);
      });
    });
  }
  
  module.exports.getUserByEmail = function(email, callback){
    var query = {email: email};
    User.findOne(query, callback);
  }
  
  module.exports.getUserById = function(id, callback){
    user.findById(id, callback);
  }
  
  module.exports.comparePassword = function(candidatePassword, hash, callback) {
    bcrypt.compare(candidatePassword, hash, function(err, isMatch) {
      if(err) throw err;
      callback(null, isMatch);
    });
  }
  </code></pre>
  
  <p>user.js routes</p>
  
  <pre><code>const express = require('express');
  const router = express.Router();
  const passport = require('passport');
  const LocalStrategy = require('passport-local').Strategy;
  
  var User = require('../models/user');
  
  router.get('/register', (req, res) =&gt; {
    res.render('register.hbs', {
      pageTitle: 'Register'
    });
  });
  
  router.get('/login', (req, res) =&gt; {
    res.render('login.hbs', {
      pageTitle: 'Login'
    });
  });
  
  router.post('/register', (req, res) =&gt; {
    var schoolName = req.body.schoolName;
    var schoolAddress = req.body.schoolAddress;
    var city = req.body.city;
    var zipCode = req.body.zipCode;
    var postalAddress = req.body.postalAddress;
    var postalCity = req.body.postalCity;
    var postalZipCode = req.body.postalZipCode;
    var telephone = req.body.telephone;
    var email = req.body.email;
    var password = req.body.password;
    var schoolType = req.body.schoolType;
    var schoolDistrict = req.body.schoolDistrict;
    var schoolRegion = req.body.schoolRegion;
    var curriculum = req.body.curriculum;
    var directorName = req.body.directorName;
    var directorTelephone = req.body.directorTelephone;
    var directorEmail = req.body.directorEmail;
    var schoolLiaisonName = req.body.schoolLiaisonName;
    var schoolLiaisonTelephone = req.body.schoolLiaisonTelephone;
    var schoolLiaisonEmail = req.body.schoolLiaisonEmail;
    var schoolLiaisonPosition = req.body.schoolLiaisonPosition;
    var schoolLiaisonTShirt = req.body.schoolLiaisonTShirt;
    var schoolLiaisonTutorMentor = req.body.schoolLiaisonTutorMentor;
  
    // validations
    req.checkBody('schoolName', 'The school name is required').notEmpty();
    req.checkBody('schoolAddress', 'The school address is required').notEmpty();
    req.checkBody('city', 'The city is required').notEmpty();
    req.checkBody('zipCode', 'This zip code is required').notEmpty();
    // req.checkBody('postalAddress', 'The postal address is required').notEmpty();
    // req.checkBody('postalCity', 'The postal city is required').notEmpty();
    // req.checkBody('postalZipCode', 'The postal zip code is required').notEmpty();
    req.checkBody('telephone', 'A telephone number is required').notEmpty();
    req.checkBody('email', 'An account email is required').notEmpty();
    // req.checkBody('email', 'This account email is not valid').isEmail();
    req.checkBody('password', 'An account password is required').notEmpty();
    req.checkBody('schoolType', 'A school type is required').notEmpty();
    req.checkBody('schoolDistrict', 'A school district is required').notEmpty();
    req.checkBody('schoolRegion', 'A school region is required').notEmpty();
    req.checkBody('curriculum', 'A curriculum is required').notEmpty();
    req.checkBody('directorName', 'A directors name is required').notEmpty();
    req.checkBody('directorTelephone', 'A directors telephone is required').notEmpty();
    req.checkBody('directorEmail', 'A directors email is required').notEmpty();
    req.checkBody('directorEmail', 'This email is not valid').isEmail();
    req.checkBody('schoolLiaisonName', 'A school liaison name is required').notEmpty();
    req.checkBody('schoolLiaisonTelephone', 'A school liaison telephone is required').notEmpty();
    req.checkBody('schoolLiaisonEmail', 'The school liaison email is not valid').isEmail();
    req.checkBody('schoolLiaisonEmail', 'A school liaison email is required').notEmpty();
    req.checkBody('schoolLiaisonPosition', 'A school liaison position is required').notEmpty();
    req.checkBody('schoolLiaisonTShirt', 'A school liaison t-shirt size is required').notEmpty();
    req.checkBody('schoolLiaisonTutorMentor', 'A school liaison tutor/mentor is required').notEmpty();
  
    var errors = req.validationErrors();
  
    if (errors) {
      res.render('register', {
        errors:errors
      });
    } else {
      var newUser = new User({
        schoolName: schoolName,
        schoolAddress: schoolAddress,
        city: city,
        zipCode: zipCode,
        postalAddress: postalAddress,
        postalCity: postalCity,
        postalZipCode: postalZipCode,
        telephone: telephone,
        email: email,
        password: password,
        schoolType: schoolType,
        schoolDistrict: schoolDistrict,
        schoolRegion: schoolRegion,
        curriculum: curriculum,
        directorName: directorName,
        directorTelephone: directorTelephone,
        directorEmail: directorEmail,
        schoolLiaisonName: schoolLiaisonName,
        schoolLiaisonTelephone: schoolLiaisonTelephone,
        schoolLiaisonEmail: schoolLiaisonEmail,
        schoolLiaisonPosition: schoolLiaisonPosition,
        schoolLiaisonTShirt: schoolLiaisonTShirt,
        schoolLiaisonTutorMentor: schoolLiaisonTutorMentor,
      });
  
      User.createUser(newUser, function(err, user) {
        if(err) throw err;
        console.log(user);
      });
  
      req.flash('success_msg', 'You are now registered, you can now login!');
      res.redirect('/users/login');
    }
  });
  
  passport.use(new LocalStrategy({
    usernameField: 'email'
    },
    function(email, password, done) {
      User.getUserByEmail(email, function(err, user){
        if(err) throw err;
        if(!user){
          return done(null, false, {message: 'Unknown Email Address'});
        }
  
        User.comparePassword(password, user.password, function(err, ismatch){
          if(err) throw err;
          if(ismatch){
            return done(null, user);
          } else {
            return done(null, false, {message: 'Invalid password'});
          }
        });
      });
    }));
  
  passport.serializeUser(function(user, done) {
    done(null, user.id);
  });
  
  passport.deserializeUser(function(id, done) {
    User.getUserById(id, function(err, user) {
      done(err, user);
    });
  });
  
  router.post('/login', passport.authenticate('local', {
    successRedirect: '/dashboard',
    failureRedirect: '/users/login',
    successFlash: 'Welcome!',
    failureFlash: 'Invalid email or password.'
  }), function(req, res) {
    // res.redirect('/' + req.user.username);
    res.redirect('/');
  });
  
  router.get('/logout', function(req, res) {
    req.logout();
    req.flash('success_msg', 'You are now logged out!')
    res.redirect('/');
  });
  
  module.exports = router;
  </code></pre>
  
  <p>The redirect occurs but I get the undefined error, so I believe everything is setup correctly apart from this error.</p>
  
  <p>Any help here would be fantastic.</p>
  
  <p>Thank you!</p>