2017-05-18 6 views
0

나는 두뇌와 핑거를 두들겨서 문제를 겪었으며 미들웨어와 express.js와 관련이 있습니다.미들웨어 상태가 실패하고 함수를 계속 실행하지 않는 경우 게시 경로에서 빠져 나옵니다.

나는 본질적으로 MongoDB 데이터베이스에서 전자 메일이 사용되고 있는지 확인하고 (잘 작동 함) 전자 메일 주소가 있으면 내 게시 경로를 계속 사용하지 않고 계정을 만들지 확인합니다. 내 플래시 메시지가 잘 작동하지만, 후에도 내 코드가 계정이 아직 만들어지지 않도록하지는 않습니다.

나는 내 사용자 스키마의 색인에 전자 메일을 추가하고 하루 만 호출 할 수 있지만 다른 방법으로는 알지 못한다는 사실을 알게되었습니다.

더 나은 코딩 지식이 부족하여 전자 메일이 존재하면 전체 router.post를 종료하고 사용자 전자 메일을 사용하고 있음을 알리는 것이 가능합니다 - 그런 다음에 (req, res) 이메일 오류에 관계없이 계정을 생성합니까?

전자 메일이 이미 사용 중인지 확인하는 데 사용하는 미들웨어 코드는 다음과 같습니다. 여기


middlewareObj.checkEmailExist = function(req, res, next){ 

    //Converts user entered email to lowercase 
    var lowercaseEmail = req.body.email.toLowerCase(); 

     //looks for user entered email in database 
    User.find({"email": lowercaseEmail}, function(err, user){ 
     if(user.length!=0) { 
      req.flash("error", "Email already exists, please enter a different email address"); 
      return res.redirect("/register"); 
     } 
    }); 

    return next(); 
}; 

그리고

는 코드입니다/POST 경로를 등록 :

router.post("/register", middleware.usernameToLowerCase, middleware.checkSignupForm, middleware.checkEmailExist, function(req, res){ 

    var newUser = new User({ 
     firstName: req.body.firstName, 
     lastName: req.body.lastName, 
     email: req.body.email, 
     username: req.body.username 
    }); 

    User.register(newUser, req.body.password, function(err, user){ 
     if(err){ 
      //For Standard error message or if not included in specific messages below 
      console.log("error", err.message); 
      return res.redirect("/register"); 
     } 

     passport.authenticate("local")(req, res, function(){ 
      req.flash("success", "Welcome To Our Community " + user.firstName + "." + "Your Username Is: " + user.username); 
      res.redirect("/featured"); 
     }); 

    }); 

}); 

당신은 이전에 호출되는 다른 미들웨어를 무시할 수, 그건 그냥 내 데이터베이스 서식입니다.

다음 번에 다시 시도해 보았습니다. (오류); 하지만 여전히 계정을 생성하는 동안 나에게 "보낸 후 헤더를 설정할 수 없습니다"오류가 발생하여 나머지 함수가 호출됩니다.

이것은 내 첫 번째 게시물이므로 잘하면 너무 혼란스럽지 않게 만들었습니다. 추가 정보/문맥이 필요하면 알려주세요. 기꺼이 알려 드리겠습니다.

미리 감사드립니다.

답변

0

미들웨어 기능에서 비동기 데이터베이스를 찾고 있습니다. 그 동안 콜백이 호출되기 전에 return next()를 호출했습니다. 과 경우의 다른 블록 미들웨어에서 다음()의 리턴을 이동

시도 (user.length! = 0) User.find에서

+0

완벽한, 내 솔루션은 내가 간과 너무 기본적인 것이었다 알고 기뻐 . 그것을 else 문으로 옮기는 것은 매력처럼 작동했습니다! 감사! – Gradientspark