NodeJS中的express-validator与passport结合使用

5

我写了一个注册表单,使用passport-local是有效的,但我想添加express-validator来验证我的表单数据。我在路由器上添加了验证,这是我的router/index.js代码:

/* Handle Registration POST */
router.post('/signup', function(req, res) {
  req.assert('email', 'A valid email is required').isEmail();
  var errors = req.validationErrors();

  if(errors){   //No errors were found.  Passed Validation!
      res.render('register', {
        message: 'Mail type fault',
        errors: errors
      });
  }
  else
  {
    passport.authenticate('signup', {
      successRedirect: '/home',
      failureRedirect: '/signup',
      failureFlash : true
    });
  }
});

验证功能是正常的,但如果验证成功,则网页会长时间加载且没有响应。我已经搜索了护照文档,但不知道如何修复它。

这是原始代码,它可以工作。

/* Handle Registration POST */
router.post('/signup', passport.authenticate('signup', {
  successRedirect: '/home',
  failureRedirect: '/signup',
  failureFlash : true
}));

我认为我可以使用jQuery进行结账,但我不会这样做。因为我只想尝试使用护照验证器。

4个回答

11

将验证代码放在LocalStrategy中应该可以正常工作,但个人建议先进行身份验证,通过后再使用passport。

考虑以下内容:

router.post('/login',function(req,res){

    req.checkBody('username', 'Username is required').notEmpty();
    req.checkBody('password', 'Password is required').notEmpty();

    //validate 
    var errors = req.validationErrors();

    if (errors) {

        res.render('signup',{user:null,frm_messages:errors});

    }
    else{
        passport.authenticate('login',{
            successRedirect:'/',
            failureRedirect: '/login',
            failureFlash : true  
        })(req,res); // <---- ADDD THIS
    }
});

我做了这个,但是它给了我一个错误:TypeError: req.checkBody 不是一个函数。 - YanetP1988

4
/* Handle Registration POST */
router.post('/signup', checkEmail,
    passport.authenticate('signup', {
      successRedirect: '/home',
      failureRedirect: '/signup',
      failureFlash : true
    });
});

function checkEmail(req, res, next){
    req.checkBody('username', 'Username is required').notEmpty();
    req.checkBody('password', 'Password is required').notEmpty();
    //validate 
    var errors = req.validationErrors();
    if (errors) {
        res.render('signup',{user:null,frm_messages:errors});
    } else {
      next();
    }
}

2

在 LocalStrategy 中进行验证而不是路由器应该可以正常工作:

passport.use('signup', new LocalStrategy({
    passReqToCallback: true
}, function(req, username, password, callback) {
    /* do your stuff here */
    /* req.assert(...) */
}));

1
我曾经遇到了完全相同的问题。我只是使用了一个中间件来检查验证,如果验证成功,则调用next()。
router.post("/login", 
  [check('email').isEmail().withMessage("A valid email is required")], 
  (req, res, next) => {
    // Check validation.
    const errors = validationResult(req);
    if (!errors.isEmpty()) {
      // handle your error (redirect, render, ..).
    }
    // if validation is successful, call next() to go on with passport authentication.
    next();
  },
  passport.authenticate("login", {
    successRedirect: "/",
    failureRedirect: "/login",
    failureFlash: true
  })
);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接