TypeError: req.flash is not a function

user3330383 picture user3330383 · Jul 1, 2016 · Viewed 11k times · Source

When I tried to log in from page, I got error return done(null, false, req.flash('loginMessage', 'User does not exist')); TypeError: req.flash is not a function.

Below are my server.js and passport.js configuration:

server.js:

var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var methodOverride = require('method-override');
var session = require('express-session');
var ejs = require('ejs');
var mongoose = require('mongoose');
var passport = require('passport');
var flash = require('connect-flash');


mongoose.connect('mongodb://localhost:mydb');

require('./config/passport')(passport);
app.use(express.static('public'));
app.set('view engine', 'ejs');
app.set('views', __dirname+'/public/views');
app.use(bodyParser.urlencoded({'extended':'true'}));
app.use(bodyParser.json());
app.use(methodOverride());
app.use(session({secret:'learningpassport',
            resave: true,
            saveUnitialized: true}));
app.use(passport.initialize());
app.use(passport.session());
app.use(flash());

require('./app/routes')(app,passport);


app.listen(3000);

config/passport.js:

var LocalStrategy = require('passport-local').Strategy;
var User = require('../app/model/user');
module.exports = function(passport){

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('local-signup', new LocalStrategy({
    usernameField: 'username',
    passwordField: 'password',
    passReqToCallback: true
},
    function(req,username, password, done){
        process.nextTick(function(){
            User.findOne({'local.username': username}, function(err, user){
                if(err) return done(err);

                if(user)
                    return done(null, false, req.flash('signupMessage','The username already exists' ));
                else{
                    var newUser = new User();
                    newUser.local.username = username;
                    newUser.local.password = newUser.generateHash(password);

                    newUser.save(function(err){
                        if(err) throw done(err);
                        return done(null, newUser);
                    });
                }
            });
        });
    }));
passport.use('local-login', new LocalStrategy({
    usernameField: 'username',
    passwordField: 'password',
    passReqToCallBack: true
},function(req,username, password, done){
    process.nextTick(function(){
     User.findOne({'local.username': username}, function(err,user){
         if(err) return done(err);
         if(!user){
             console.log(req.flash);
             return done(null, false, req.flash('loginMessage', 'User does not exist'));
         }

         if(!user.validPassword(password)){
             return done(null,false, req.flash('loginMessage', 'Password is not correct'));
         }

         return done(null, user);
     });
    });
}));
};

I would really appreciate everyone's help!!!

loginservice.config.js

'use strict';

angular.module('loginservice').factory('lgservice',function($http){
var myservice = {
    async: function(username, password){
        var promise = $http.post('/login',{
            username: username,
            password: password
        }).then(function(response){
            return response;
        });
        return promise;
    }

};
return myservice;
});

routes.js

module.exports = function(app,passport) {

app.get('/', function (req, res) {
    console.log('/');
    res.render('pages/login', {
        message: req.flash('loginMessage')
    });
});

app.get('/about', function (req, res) {
    console.log('/about');
    res.render('pages/about');
});

app.get('/signup', function (req, res) {
    console.log('sign up');
    res.render('pages/signup', {
        message: req.flash('signupMessage')
    });
});

app.get('/logout', function (req, res) {
    req.logout();
    res.redirect('/');
});

app.get('/home', isLoggedIn, function (req, res) {
    res.render('pages/home', {
        user: req.user
    });
});

app.post('/signup', passport.authenticate('local-signup', {
    successRedirect: '/home',
    failureRedirect: '/signup',
    failureFlash: true
}));

app.post('/login', passport.authenticate('local-login', {
    successRedirect: '/home',
    failureRedirect: '/',
    failureFlash: true
}));
};


funtion isLoggedIn(req,res,next){
if(req.isAuthenticated()){
    return next();
}
res.redirect('/');
}

Answer

DAXaholic picture DAXaholic · Jul 1, 2016

You probably have to move app.use(flash()); up the middleware stack so that it is processed before passport.