当用户成功登录到我的应用程序时,我正在尝试通过连接闪存呈现闪存消息。
我可以控制台注销闪存消息,但它们似乎没有得到客户端渲染。
但是,我知道客户端没有任何问题,因为当我用像'You have successfully login!'
这样的简单字符串替换路由中的req.flash[0]
时,消息确实会出现。
护照配置:
// Local login Strategy
passport.use('local-login', new LocalStrategy(
{
usernameField: 'email',
passwordField: 'password',
passReqToCallback: true
},
(req, email, password, done) => {
User.findOne({ 'local.email': email })
.then(user => {
if (!user) return done(null, false);
user.validPassword(password, (err, res) => {
if (err) return done(err);
if (!res) return done(null, false);
done(null, user, req.flash('success', 'Login Successful!'));
});
})
.catch(err => done(err));
}
));
路线:
app.post(
'/api/login',
passport.authenticate('local-login'),
(req, res) => {
console.log(req.flash('success'));
const user = {
user: req.user,
msg: req.flash('success')[0] // Works when I replace with 'You have successfully logged in'
};
res.send(user);
}
);
服务器:
const express = require('express');
const bodyParser = require('body-parser');
const mongoose = require('mongoose');
const passport = require('passport');
const flash = require('connect-flash');
const cookieParser = require('cookie-parser');
const cookieSession = require('cookie-session');
const keys = require('./config/keys');
require('./models/User');
require('./services/passport');
mongoose.connect(keys.mongoURI);
const app = express();
app.use(bodyParser.json());
app.use(cookieParser());
app.use(flash());
app.use(
cookieSession({
maxAge: 30 * 24 * 60 * 60 * 1000,
keys: [keys.cookieKey]
})
);
app.use(passport.initialize());
app.use(passport.session());
require('./routes/authRoutes')(app);
app.get('/', (req, res) => {
res.json({ message: 'hello' });
});
if (process.env.NODE_ENV === 'production') {
app.use(express.static('client/build'));
const path = require('path');
app.get('/', (req, res) => {
res.sendFile(path.resolve(__dirname, 'client', 'build', 'index.html'));
});
}
const PORT = process.env.PORT || 5000;
app.listen(PORT, () => console.log('Working'));
奇怪的问题,但事实证明,在将其合并到响应之前调用console.log(req.flash('success')
实际上使它失败。一旦我删除了控制台日志行,它就开始工作了。
不知道为什么会这样 - 不知道为什么会这样,如果有人有任何想法会想知道。
req.flash背后的想法是与重定向(res.redirect)一起使用,并且只显示一次,因此您无需重复代码。我也为此苦苦挣扎了一段时间,直到我认为这将使我的路由更加健壮(特别是如果您要去数据库获取数据并需要显示错误消息)。
大多数人会这样做:
callDatabase().then ((data)=>{
res.render('samepage', data: data, error: error.message)
})
如果他们需要一遍又一遍地查找特定数据(即验证目的),这将在多条路线上重复。
一种优雅的方法是创建一个特定的路由器来获取特定数据,并通过使用会话方法处理错误,在这种情况下,连接闪存模块,以便:
router.get('/findData', (req,res)=>{
callDatabase().then( (data)=> res.render('index',data));
});
然后:
router.get('whatever', (req,res)=>{
// error in something
req.flash('error', 'Show this error based on this router!')
res.redirect('/findData');
});
这样,您就可以始终依靠router.get('/findData')..,只需保存错误并在以后重定向即可。