首页 > 解决方案 > 使用护照登录时出现 TypeError 时出现问题:req.flash

问题描述

我遇到了与其他堆栈溢出线程几乎相同的问题,但是给出的解决方案似乎都不起作用。

这是我尝试登录时收到的错误消息:

TypeError: req.flash is not a function
at index.js:151:5

以下是路由index.js文件中的重要部分

 router.get("/login", function(req, res) {
   res.render("login", {message: req.flash('error')});
 });

 // login Process
  router.post("/login", function(req, res, next) {
     passport.authenticate('local', {
       successRedirect:'customer/dashboard',
       failureRedirect:'/login',
       failureFlash: true
     })(req, res, next);
   }); 
    **// this where im getting an error**
    module.exports = router;

所以错误指向 router.post ,它在我的passport.js文件中调用 LocalStrategy :

module.exports = function(passport) {
  //LocalStrategy
  passport.use(new LocalStrategy(function(email, password, done) {
      let query = {email: email};
      // checking the name in the database against the one submitted on the form
      Customer.findOne(query, function(err, customer) {
        if (err) throw err;
        if (!customer) {
          return done(null, false, { message : 'No such password', type : 'error' });
        }
        //Match password
        bcrypt.compare(password, customer.password, function(err, isMatch) {
          if (err) throw err;
          if (isMatch) {
            return done(null, customer);
          } else {
            return done(null, false, { message : 'No such password', type : 'error' });
            // if the password isnt an matc return wrong password
          }
        });
      });
    })
  );
}
  passport.serializeUser(function(customer, done) {
    done(null, customer.id);
  });

  passport.deserializeUser(function(id, done) {
    Customer.findById(id, function(err, customer) {
      done(err, customer);
    });
  });

并且我的login.ejs文件具有文档中所述的代码:

<% if (message.length > 0) { %>
  <div class="alert alert-danger"><%= message %></div>
<% } %>

我已经检查了所有内容,包括我的 app.js 文件中的依赖项配置:

// Passport Config
require('./config/passport')(passport);
// Passport Middleware
app.use(passport.initialize());
app.use(passport.session());

app.use(cookieparser());

// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))
// parse application/json
app.use(bodyParser.json())

app.listen(3000, function() {
  console.log('server is running');
});
app.use(flash());
app.use(routes);

请帮忙!我在这个错误上花了大约 11 个小时。

标签: node.jsexpresspassport.jsejs

解决方案


在您对 的调用中passport.authenticate,您传递res了两次:

 passport.authenticate('local', {
   successRedirect:'customer/dashboard',
   failureRedirect:'/login',
   failureFlash: true
 })(res, res, next);
    ^^^  ^^^

显然,第一个应该是req

但除此之外,我看不到reqpassport.js. 如果您需要访问req策略处理程序内部,则需要设置passReqToCallback选项:

passport.use(new LocalStrategy({ passReqToCallback : true }, function(req, email, password, done) {
  ...
}));

此外,在调用 时done,您需要对第三个参数使用固定格式:

{ message : 'No such password', type : 'error' }

并且在渲染时:

res.render("login",{ message: req.flash('error') });

推荐阅读