node.js - 对 Node/Express 应用程序使用 connect-flash 时无法获取要渲染的 Flash 消息

标签 node.js session express cookies flash-message

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

我可以通过控制台注销闪现消息,但它们似乎没有在客户端呈现。

但是,我知道客户端没有任何问题,因为当我用像 ' 这样的简单字符串替换路由中的 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') 实际上导致了失败。一旦我删除了控制台日志行,它就开始了工作。

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

关于node.js - 对 Node/Express 应用程序使用 connect-flash 时无法获取要渲染的 Flash 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46821199/

相关文章:

node.js - 关闭终端后保持快速进程

node.js - 如何修复 NodeJS 未充分利用 CPU 内核?

c# - 从不同线程访问 HttpContext.Current

node.js - 是否可以使用 webpack 热重载服务器端代码?

node.js - 如何使用 Express JS 和 Jade 访问 instagram API?

php - 如何在 POST 请求期间刷新 session ?

javascript - Node.js 路由 : Adding route handlers to an already instantiated http server

javascript - 检查 JavaScript 类是否包含静态方法

Node.JS 在没有换行符的情况下写入标准输出

authentication - spring-security:无需身份验证的授权