2015-01-08 4 views
3

내 주 컨트롤러 기능에서 체인화 및 오류 처리를 위해 사용할 수 있도록 몽구스 정적 메서드 'load'를 만듭니다.mongoose 정적 메서드가 bluebird 약속을 반환합니다

UserSchema.load('54ae92dd8b8eef540eb3a66d') 
.then(....) 
.catch(....); 

문제는 ID가 잘못되어이 오류를 catch해야합니다. 모델 레이어에서이 작업을 수행하는 것이 더 바람직하다고 생각합니다.

다음과 같이하면 컨트롤러가이 오류를 포착 할 수 있습니다.

UserSchema.statics.load = function(id) { 

    if (!mongoose.Types.ObjectId.isValid(id)) { 
     return Promise.resolve().then(function() { 
      throw new Error('not a mongoose id'); 
     }); ------------(*) 
    } 

    return Promise.cast(this.findOne({ 
     _id: id 
    }).exec()); 
}; 

그러나 내가 다음을 수행하면 컨트롤러 .catch 함수에 오류가 성공적으로 전달되지 않습니다.

AchievementSchema.statics.load = function(id) { 
    if (!mongoose.Types.ObjectId.isValid(id)) { 
     throw new Error('not a mongoose id'); 
    } 
    return Promise.cast(this.findOne({ 
     _id: id 
    }).exec()); 
}; 

제 질문은 올바르게 수행하고 있습니까? 그렇다면 더 쉬운 방법으로 (*) 문장을 쓸 수 있습니까? 내가하고있는 것은 못생긴 것처럼 보인다. 고마워.

답변

8

예, Promise.reject이라는 속기가 있습니다.

에 귀하의 코드 :

if (!mongoose.Types.ObjectId.isValid(id)) { 
    return Promise.resolve().then(function() { 
     throw new Error('not a mongoose id'); 
    }); ------------(*) 
} 

은 다음과 같이 쓸 수있다 : 당신은 더 나은 생각을 할 수

return Promise.reject(new Error("Not a mongoose id"); 

, Promise.method이 약속을 반환하는 약속 를 반환 할 수 있습니다 무엇을 위해 존재한다 :

UserSchema.statics.load = Promise.method(function(id) { 

    if (!mongoose.Types.ObjectId.isValid(id)) { 
     throw new Error('not a mongoose id: ' + id); 
    } 
    return this.findOne({ _id: id }).exec()); 
}); 

티 두 경우 모두 findOne 결과를 Bluebird의 신뢰할 수있는 약속에 적용하고 throw을 거부합니다. 그래도 Error 대신에 Promise.OperationalError의 서브 클래스를 던지는 것을 고려할 수 있습니다.

관련이없는 팁 Promise.cast은 1 년 전에 Promise.resolve으로 호의적으로 사용되지 않았습니다.

+0

방금 ​​대답에 찬성표를 던지는 걸 잊어 버렸습니다. –

+0

약속을 모두 블루 버드 약속에 던지지 않는다면'Promise.method'의 약속은 경쟁 조건이됩니까? –

관련 문제