2016-11-23 50 views
0

私は過去1時間このコードを見つめていますが、問題を解決する方法がわかりません。'TypeError: req.flash is not a functionです。私はapp.use(flash)を動かしてみましたが、まだエラーが出ています。これをどうすれば解決できますか? the documentationパーreq.flashは関数ではありません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

私は明示的なエキスパートではありませんが、他のすべての「app.use」は、関数を呼び出した結果です。 'expressValidator()'、 'bodyParser.json()'など –

答えて

2

app.use()で設定したミドルウェアは、宣言された順に実行されているため、あなたの場合は、セッションハンドリングの前にフラッシュモジュールが呼び出されます。 connect-flash-docsをすばやく見てみると、他のセッション関連のミドルウェアがセットアップされた後にapp.use(flash());が呼び出される必要があることがわかりますので、いくつかの行を下に移動して問題を解決してください。接続フラッシュ・ドキュメントから

引用:

フラッシュメッセージは、セッションに格納されています。まず、cookieParserとセッションミドルウェアを有効にして、通常通りにセッションを設定します。次に、connect-flashで提供されるフラッシュミドルウェアを使用します。

2

、この変更:これに

app.use(flash); 

app.use(flash()); 

をそして、あなたの他のルートの定義の前に、しかし、あなたのセッション定義した後であるためにあなたのapp.use(flash())を移動します。

+0

が 'app.use(flash())'に変更されました。 – julekgwa

+0

@julekgwa - 'app.use(flash());'を他のルート定義の前に移動する必要がありますが、セッション定義の後に移動する必要があります。 – jfriend00

関連する問題