2013-03-08 3 views
3

그래서 내 사용자 스키마에는 기본적으로 방금 가지고 있고 프로필 배열 (각 사용자는 여러 로그인 전략을 가질 수 있음)에 findOrCreate을 구현하고 있습니다. 사용자가 제공된 제공자와 ID가 일치하는 프로파일을 가지고 우리가 findOrCreate이라고하는 제공된 프로파일을 사용함으로써 사용자를 확실하게 식별 할 수 있다고 생각하면됩니다. findOrCreate의 목표는 제공된 프로파일과 일치하는 사용자를 식별하거나 제공된 프로파일을 사용하여 새 사용자를 작성하는 것입니다. 이 함수에는 네 가지 반환 사례가 있습니다. node.js + mongoose UserSchema findOrCreate

  • 사용자가
  • 오류가 사용자를 찾을 실패하고 만들려고 후에 발생했습니다
  • 사용자에 대해 질의하면서

    1. 오류가 발생 한
    2. 사용자를 찾는 데 실패하고 성공적으로 생성 한

    이제 다음 코드가이를 수행한다고 생각합니다. 이 질문에 대한 나의 우려와 이유는 findOne에 제공된 콜백이 일관되게 반환되지 않는다는 것입니다. 사용자를 쿼리하는 동안 오류가 발생하면 콜백 (...)을 반환하고 사용자를 찾으면 콜백 (...)을 반환하지만 사용자를 생성해야하는 경우 명시 적으로 반환하지 않습니다. 구원받은 결과를 반환 할 수 있습니까? 그게 내가해야 할 일 이니, 아니면 내가 가지고있는 방식대로이게 맞습니까?

    코드 :

    UserSchema.static('findOrCreate', function (profile, callback) { 
        this.findOne({ profiles: { $elemMatch: { provider: profile.provider, id: profile.id }}}, function(err, user) { 
         if (err) 
          return callback(err); 
    
         if (user) 
          return callback(null, user); 
    
         user = new User({ 
          profiles: [profile] 
         }); 
         user.save(function (err, user) { 
          if (err) 
           return callback(err); 
    
          return callback(null, user); 
         }); 
        }); 
    }); 
    
    +1

    이 코드는 정상적으로 보입니다. 그것을 깨끗하게하는 베드로의 생각은 좋은 것이지만, 당신이 여기에있는 것은 여전히 ​​효과가 있어야합니다. – JohnnyHK

    답변

    1

    그냥 인라인 익명 함수 이후 user.save(callback);save가 이미 콜백 무엇을 본질적으로 동일하다. return 문은 순전히 흐름 제어 메커니즘이며이 함수 내에서 후속 코드의 실행을 피하는 것이 유일한 목적이며 노드의 비동기 프로그래밍에서 일반적으로 사용되는 것처럼 실제 반환 값 자체는 호출자가 전적으로 무시합니다. if/return guard 절 대신 if/else 블록을 사용하여 동일한 논리를 코딩 할 수 있으며 return 키워드를 전혀 사용하지 않고이 함수가 올바르게 작동합니다.

    관련 문제