2016-11-23 3 views
0

J'ai regardé ce code pendant une heure et je ne sais pas comment résoudre le problème, je reçois 'TypeError: req.flash is not a function. J'ai essayé de déplacer app.use(flash) autour et toujours je reçois l'erreur. Comment puis-je réparer cela?req.flash n'est pas une fonction Nodejs

var flash = require('connect-flash'); 
var express = require('express'); 
var path = require('path'); 
var cookieParser = require('cookie-parser'); 
var bodyParser = require('body-parser'); 
var handlebars = require('express-handlebars').create({ 
     layoutsDir: path.join(__dirname, "views/layouts"), 
     partialsDir: path.join(__dirname, "views/partials"), 
     defaultLayout: 'layout', 
     extname: 'handlebars' 
}); 
var expressValidator = require('express-validator'); 
var session = require('express-session'); 
var passport = require('passport'); 
var localStrategy = require('passport-local').strategy; 
var mongo = require('mongodb'); 
var mongoose = require('mongoose'); 
mongoose.connect('mongodb://localhost/login'); 
var db = mongoose.connection; 

// init app 
var app = express(); 

var routes = require('./routes/index'); 
var users = require('./routes/users'); 

// view engine 
app.engine('handlebars', handlebars.engine); 
app.set('view engine', 'handlebars'); 
app.set('views', path.join(__dirname, "views")); 

app.use(expressValidator()); 

// bodyParser Middleware 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: false })); 
app.use(cookieParser()); 

// set static folder 
app.use(express.static(path.join(__dirname, 'public'))); 
app.use('/', routes); 
app.use('/users', users); 

app.use(flash); 

// express session 
app.use(session({ 
    secret: 'secret', 
    saveUninitialized: true, 
    resave: true 
})); 

// passport init 
app.use(passport.initialize()); 
app.use(passport.session()); 

// Global Vars 
app.use(function (req, res, next) { 
    res.local.success_msg = req.flash('success_msg'); 
    res.local.error_msg = req.flash('error_msg'); 
    res.local.error = req.flash('error'); 
    next(); 
}); 

// set Port 
app.set('port', (process.env.PORT || 3000)); 
app.listen(app.get('port'), function() { 
    console.log('Server started on port ' + app.get('port')); 
}); 
+0

Je ne suis pas un expert exprès, mais tous les autres 'app.use' le paramètre est le résultat de l'appel d'une fonction - par ex. 'expressValidator()', 'bodyParser.json()' etc –

Répondre

2

Le middleware que vous avez configuré avec app.use() est exécuté dans l'ordre dans lequel il a été déclaré. Dans ce cas, le module flash sera appelé avant la session. Un rapide coup d'oeil dans le connect-flash-docs révèle que app.use(flash()); devrait être appelé après l'installation de l'autre middleware lié à la session, alors essayez de le déplacer sur certaines lignes, cela devrait résoudre votre problème.

Citation Connect-flash-docs:

Les messages flash sont stockés dans la session. Tout d'abord, configurez les sessions comme d'habitude en activant le middleware cookieParser et de session. Ensuite, utilisez le middleware flash fourni par connect-flash.

2

Per the documentation, changer ceci:

app.use(flash); 

à ceci:

app.use(flash()); 

Et, déplacez votre app.use(flash()) être avant vos autres définitions de l'itinéraire, mais après vos définitions de session.

+0

changé en 'app.use (flash())' et je reçois toujours la même erreur. – julekgwa

+0

@julekgwa - Vous devez également déplacer 'app.use (flash());' avant vos autres définitions d'itinéraire mais après vos définitions de session. – jfriend00