使用通行证登录时遇到类型错误:req.flash

时间:2018-11-08 16:23:09

标签: node.js express passport.js ejs

我遇到了与此另一个堆栈溢出thread几乎相同的问题,但是给出的解决方案似乎都不起作用。

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

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个小时来解决这个错误。

1 个答案:

答案 0 :(得分:0)

在致电passport.authenticate时,您两次传递了res

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

显然,第一个应该是req

不过,除此之外,我没有看到req中的任何地方都定义了passport.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') });