在对节点/快速应用使用连接闪存时无法呈现 Flash 消息



当用户成功登录到我的应用程序时,我正在尝试通过连接闪存呈现闪存消息。

我可以控制台注销闪存消息,但它们似乎没有得到客户端渲染。

但是,我知道客户端没有任何问题,因为当我用像'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')..,只需保存错误并在以后重定向即可。

最新更新