在为Node / Express应用程序使用connect-flash时,无法获取要呈现的Flash消息

时间:2017-10-19 00:27:59

标签: node.js session express cookies flash-message

当用户成功登录我的应用时,我尝试通过connect-flash呈现Flash消息。

我可以通过控制台注销flash消息,但它们似乎不会被渲染到客户端。

但是,我知道客户端没有任何问题,因为当我用req.flash[0]之类的简单字符串替换路线中的'You have successfully login!'时,消息 出现。

Passport配置:

// 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'));

2 个答案:

答案 0 :(得分:2)

奇怪的问题,但是在将console.log(req.flash('success')纳入响应之前调用keyword = window.getSelection().toString(); use(keyword); 实际上使其失败了。一旦我删除了控制台日志行,它就开始工作了。

不知道为什么会这样 - 不知道为什么会这样,如果有人有任何想法会很想知道。

答案 1 :(得分:1)

req.flash背后的想法是与重定向(res.redirect)一起使用,并且仅显示一次,因此您无需重复代码。 我一直在努力,直到我发现这会使我的路由更健壮(特别是如果您要去数据库以获取数据并需要显示错误消息)。

大多数人会这样做:

callDatabase().then ((data)=>{
res.render('samepage', data: data, error: error.message)
})

,如果他们需要一遍又一遍地查找特定数据(即验证目的),则会在多个路由中重复进行此操作。

一种优雅的方法是创建一个特定的路由器来获取特定的数据并通过使用会话方法(在这种情况下, connect-flash模块如下:

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')。