2017-11-02 16 views
0

편집 2018-01-18 : 약속 대신 async/await을 사용하십시오. 모든 문제를 해결할 것입니다.Mongoose 약속 오류를 처리하는 동안 체인을 끊으십시오.

나는 내가 찾은 어떤 사용자가없는 경우 실행을 중지하고 단지 보내려 NodeJS

User.find({ name: 'John' }) 
     .then((users) => { 
     if (!users.length) return res.send('No users found.'); 
     return Request.find({ cost: 100 }) 
     }) 
     .then((requests) => { 
     console.log('should not get here'); 
     return res.json(requests); 
     }) 
     .catch((err) => { 
     res.status(500).json(err); 
     }) 

에서 몽구스이 코드가 "어떤 사용자를 찾을 수 없습니다." 다른 것을 실행하지 않고.

대신 throw res.send('No users found.');을 사용할 수 있다는 것을 알고 있습니다.

하지만 그럴 경우 예를 들어 저장 또는 업데이트하는 동안 발생할 수있는 진정한 오류를 파악하고 관리 할 수 ​​없습니다.

어떻게 접근해야합니까? 다른 코드 구조를 사용해야합니까? 나는이 단점을 제외하고이 구조가 얼마나 단순하고 유지 보수가 잘되는지를 좋아한다.

+0

* "그렇다면 내가 진짜 오류를 잡을 수 없게 될 것입니다."* 어떻게 그렇게? 내가 마지막으로 드라이버를 검사했을 때 오류 코드가있는 "유익한"구조화 된 오류 객체가 반환 되었기 때문에. 정규 패턴은 "중복 키 오류"에 "잉태/경고"입니다. 예외가 실제로는 치명적인 것은 아니지만 실제로 심각한 다른 데이터베이스 연결이 끊어지는 것과 같습니다. 그래서 전형적인 것은 할 일은 .catch()에서 "inspect"하고, 어떤 정보를 가지고 있는지에 따라'err'을 어떻게할지 결정합니다. 따라서 새로운 오류()를 던져서 식별하십시오. ** IS ** 할 일은 옳습니다. –

+0

오류, mongoose 오류, mongodb 오류가 발생할 수있는 데는 여러 가지 이유가 있습니다. 어떤 통합 구조를 사용해야합니까? 방금'''if (! err.domain) {// 이것은 진짜 오류입니다}''' 그런 식으로'''res.send()'''가 아닌 것을 배제하고 있습니다. Is 거기에 오류를 인식하는 더 나은 방법은? – Hafez

+0

"몽구스 오류"같은 것이 없습니다. 이것은 "운전자에게 똑바로"입니다. 나는 방금 전 세계의 다른 것들이 포장 된 좋은 예를 보여주었습니다. 고의적 인 쓰기 오류를 직접 작성하고 리턴 된 오브젝트를 점검 한 다음, 정확히 같은 내용을 볼 수 있습니다. 당신도 똑같은 일을해야합니다. 예제에서 보았 듯이 ** 정규 ** 연습에서는 반환 된 오류 객체의 속성으로'err.code'를보고 중복 키'E11000'을 기대합니다. –

답변

1

당신은 어떻게 반응에 대한 그것의 결정을 내리는 오류에 더 많은 메타 데이터를 볼 수 있습니다 ES2015/6

class ExtendedError { 
    constructor(message){ 
    super(message) 
    this.name = this.constructor.name 
    this.message = message 
    if (typeof Error.captureStackTrace === 'function'){ 
     Error.captureStackTrace(this, this.constructor) 
    } else { 
     this.stack = (new Error(message)).stack 
    } 
    } 
} 

class NotFoundError extends ExtendedError { 
    constructor(message, options){ 
    super(message) 
    this.status = 404 
    this.code = 'NF0001' 
    } 
} 

귀하의 오류 처리 코드에서 오류 클래스를 확장 할 수 있습니다.

User.find({ name: 'John' }) 
    .then((users) => { 
    if (!users.length) throw new NotFoundError('No users found.')   
    return Request.find({ cost: 100 }) 
    }) 
    .then((requests) => { 
    console.log('should not get here') 
    return res.json(requests); 
    }) 
    .catch((err) => { 
    let status = err.status || 500 
    res.status(500).json({ error: err }) 
    }) 

모든 처리기에 대한 응답 및 오류 처리를 반복하지 않도록 일반 익스프레스 API 요청/응답 처리기를 만들고 싶을 수 있습니다. 그런 다음 처리기 코드는 데이터를 반환하거나 오류를 throw하면됩니다.

User.find({ name: 'John' }) 
    .then((users) => { 
    if (!users.length) throw new NotFoundError('No users found.')   
    return Request.find({ cost: 100 }) 
    })