2016-09-20 5 views
0

저는 실제로 학교 프로젝트에서 일하는데 마이크로 프레임 워크로 데이트 웹 사이트를 운영해야합니다. ExpressJS를 사용하여 NodeJS를 배우기로 선택했으나 비동기식 서버에 대해 고민 중입니다 ... 전자 메일 주소 또는 암호를 업데이트하기 위해 이전 암호를 입력해야하는 프로필 업데이트 양식을 만들려고합니다. 또는 하나의 양식에 둘 다. 그러나 비동기로 나는 형식을 검증하는 방법을 모른다.익스프레스가있는 양식의 선택 입력란

ORM, 유효성 검사기 또는 사용자 관리자 (예 : 여권)를 사용할 수 없습니다. 여기

내가

router.post('/changeCredentials', isConnected, (request, response) => { 
    var user = User.formJSON(request.session.user); 

    if (User.hashPassword(request.body.old_password, user.salt) === user.password) 
    { 
     if (request.body.email !== undefined && request.body.email !== user.email) 
     { 
      request.formValidate('email', 'Email not valid').isNotEmpty().isEmail(); 
      request.formValidate('email', 'Email already used').isUnique(User,() => { 
       if (request.formIsValid) 
       { 
        user.email = request.body.email; 
        request.user.connect(user); 
        console.log(request.session); 
        User.update(user,() => { 
         request.flash('success', 'Email updated'); 
        }); 
       } 
      }); 
     } 

     if (request.body.new_password !== undefined && request.body.new_password !== '') 
     { 
      request.formValidate('new_password', 'Password is not valid.').isNotEmpty().isLength(6, 255).isGoodPassword(); 
      request.formValidate('new_password', 'Password does not match').isEqualTo(request.body.new_password_conf); 

      if (request.formIsValid) 
      { 
       user.password = request.body.new_password; 
       User.update(user,() => { 
        request.flash('success', 'Password changed!'); 
       }, true); 
      } 
     } 
    } 
    else 
    { 
     request.flash('error', 'Bad Old password'); 
    } 
    response.redirect('/u/profile'); 
}); 

Full code here가 (당신이 '경로/사용자에서이 부분을 찾을 수있는 양식을 검증하기 위해

router.get('/profile', isConnected, (request, response) => { 
    response.render('profile.ejs'); 
}); 

두 번째 경로 폼에

첫 번째 경로를 뭘하려 .js ')

도움 주셔서 감사합니다.

+0

'asynchone'의 의미는 무엇이며 어디에 고정 되었습니까? – abdulbarik

+0

죄송 합니다만 비동기식입니다. 내 문제는 2 User.update 콜백에, request.flash가 너무 늦게 실행되고 페이지가 새로 고쳐지면 메시지가 표시되지 않기 때문에 생성되지 않았기 때문입니다. – Snosky

답변

0

이것은 비동기 콜백의 일반적인 문제입니다. 포괄적 인 리디렉션은 비동기 호출을 무시하므로 가능한 모든 경로에서 응답해야합니다.

router.post('/changeCredentials', isConnected, (request, response) => { 
    var user = User.formJSON(request.session.user); 

    if (User.hashPassword(request.body.old_password, user.salt) === user.password) 
    { 
     if (request.body.email !== undefined && request.body.email !== user.email) 
     { 
      request.formValidate('email', 'Email not valid').isNotEmpty().isEmail(); 
      request.formValidate('email', 'Email already used').isUnique(User,() => { 
       if (request.formIsValid) 
       { 
        user.email = request.body.email; 
        request.user.connect(user); 
        console.log(request.session); 
        User.update(user,() => { 
         request.flash('success', 'Email updated'); 
         response.redirect('/u/profile'); 
        }); 
        return; 
       } 
       response.redirect('/u/profile'); 
      }); 
      return; 
     } 

     if (request.body.new_password !== undefined && request.body.new_password !== '') 
     { 
      request.formValidate('new_password', 'Password is not valid.').isNotEmpty().isLength(6, 255).isGoodPassword(); 
      request.formValidate('new_password', 'Password does not match').isEqualTo(request.body.new_password_conf); 

      if (request.formIsValid) 
      { 
       user.password = request.body.new_password; 
       User.update(user,() => { 
        request.flash('success', 'Password changed!'); 
        response.redirect('/u/profile'); 
       }, true); 
       return; 
      } 
     } 
    } else { 
     request.flash('error', 'Bad Old password'); 
    } 
    response.redirect('/u/profile'); 
}); 

위의 코드는 콜백 형식 접근 방식을 보여줍니다. Promises와 Generator를 사용하여 더욱 세련된 솔루션을 만들 수 있습니다.

+0

답변 해 주셔서 감사합니다. 그러나이를 통해 이메일과 비밀번호를 한 번에 변경할 수는 없습니다. – Snosky

관련 문제