2016-06-21 3 views
0

첫 번째 유효성 검사 미들웨어없이 본문 유효성 검사와 오류 처리가 필요합니다. 이 코드는 잘 작동하지만 첫 번째 미들웨어를 삭제하고 두 번째 미들웨어 내에서 유효성을 관리하고 싶습니다.본문 유효성 검사 및 오류 처리 기능이있는 Passport.js 로컬 로그인

{ 
    "error": "Invalid email and/or password" 
} 

나는이 싶습니다 : 사용자가 일치하지 않는 경우, 에러 처리에 관해서는

경로가/

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

    req.checkBody('email', 'Email is required.').notEmpty(); 
    req.checkBody('email', 'Invalid email format.').isEmail(); 
    req.checkBody('password', 'Password is required.').notEmpty(); 
    req.checkBody('password', 'The password length must be between 8 and 100.').isLength({min: 8, max: 100}); 

    var err = req.validationErrors(); 
    if (err) { 
     res.status(400).send({ success: false, error: err}); 
     return; 
    } 
    next(); 
}); 

router.post('/signin', passport.authenticate('local', { session: false }), function(req, res){ 
    var user = req.user; 
    return res.json({success: true, user: user}); 
}); 

을 auth.js 오류는

{ 
    "success":false, 
    "error": "Invalid email and/or password" 
} 

어떻게하면됩니까?

는 응답에 대한

passport.use(new LocalStrategy({ 
     usernameField: 'email', 
     passwordField: 'password' 
    }, 
    function(email, password, done) { 
     User.findOne({ email: email, password: password },'-password', function (err, user) { 
      if (err)return done(err); 
      if(!user){ 
       var err = new Error('Invalid email and/or password'); 
       err.status = 401; 
       return done(err, false); 
      } 

      return done(null, user); 
     }) 
    } 
)); 

감사 passport.js.

답변

2

정확하게 이해하면 LocalStrategy 개체의 확인 기능에서 유효성 검사를 수행해야합니다.

이렇게하기 전에 먼저 req 개체에 액세스해야합니다.

function(req, email, password, done) { 
    req.checkBody('email', 'Email is required.').notEmpty(); 
    req.checkBody('email', 'Invalid email format.').isEmail(); 
    req.checkBody('password', 'Password is required.').notEmpty(); 
    req.checkBody('password', 'The password length must be between 8 and 100.').isLength({min: 8, max: 100}); 

    var err = req.validationErrors(); 
    if (err) { 
     return done(err, false, { success: false, error: err}); 
    } 
    User.findOne({...}); 
}); 

을 그리고 마지막으로, 당신이 필요합니다 : 첫 번째 미들웨어와 같은 유효성 검사 코드를 사용할 수 있습니다, 거기에서

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

:이를 위해, 당신은 전략의 passReqToCallback 옵션을 활성화해야

router.post('/signin', function(req, res, next) { 
    passport.authenticate('local', { session : false }, function(err, user, info) { 
    if (err) return next(err); 
    if (! user) { 
     return res.status(400).json(info); 
    } 
    return res.json({ success : true, user : req.user}); 
    })(req, res, next); 
}); 

콜백에 info 인수는 일에 매핑 : 검증 결과를 처리 할 수 ​​passport.authenticate()에 대한 사용자 정의 콜백을 사용 확인 핸들러의 done() 콜백의 3 번째 인수

요청 본문의 email 또는 password이 비어 있으면 Passport에서 로컬 전략 처리기를 호출하지 않으므로 notEmpty 유효성 검사가 부적절한 것입니다.

관련 문제