Проблема входа в систему с паспортом, получая TypeError: req.flash - PullRequest
0 голосов
/ 08 ноября 2018

У меня практически идентичная проблема с этим другим переполнением стека thread , однако ни одно из приведенных решений не работает.

Вот сообщение об ошибке, которое я получаю при попытке входа в систему:

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

Вот важные биты из маршрутов index.js file

 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, который вызывает LocalStrategy в моем passport.js файле:

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 голосов
/ 08 ноября 2018

При звонке на 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') });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...