req.flash 不是函数 Nodejs
req.flash is not a function Nodejs
过去一个小时我一直盯着这段代码,但我不知道如何解决这个问题,我正在 'TypeError: req.flash is not a function
。我试过移动 app.use(flash)
,但仍然出现错误。我该如何解决这个问题?
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'));
});
根据 the documentation,更改为:
app.use(flash);
对此:
app.use(flash());
并且,将您的 app.use(flash())
移动到您的其他路由定义之前,但在您的会话定义之后。
您使用 app.use()
设置的中间件按照声明的顺序执行,因此在您的情况下,将在会话处理之前调用闪存模块。
快速查看 connect-flash-docs 发现 app.use(flash());
应该在设置其他与会话相关的中间件后调用,因此请尝试将其向下移动一些行,这应该可以解决您的问题。
引自 connect-flash-docs:
Flash messages are stored in the session. First, setup sessions as usual by enabling cookieParser and session middleware. Then, use flash middleware provided by connect-flash.
过去一个小时我一直盯着这段代码,但我不知道如何解决这个问题,我正在 'TypeError: req.flash is not a function
。我试过移动 app.use(flash)
,但仍然出现错误。我该如何解决这个问题?
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'));
});
根据 the documentation,更改为:
app.use(flash);
对此:
app.use(flash());
并且,将您的 app.use(flash())
移动到您的其他路由定义之前,但在您的会话定义之后。
您使用 app.use()
设置的中间件按照声明的顺序执行,因此在您的情况下,将在会话处理之前调用闪存模块。
快速查看 connect-flash-docs 发现 app.use(flash());
应该在设置其他与会话相关的中间件后调用,因此请尝试将其向下移动一些行,这应该可以解决您的问题。
引自 connect-flash-docs:
Flash messages are stored in the session. First, setup sessions as usual by enabling cookieParser and session middleware. Then, use flash middleware provided by connect-flash.