편집 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.');
을 사용할 수 있다는 것을 알고 있습니다.
하지만 그럴 경우 예를 들어 저장 또는 업데이트하는 동안 발생할 수있는 진정한 오류를 파악하고 관리 할 수 없습니다.
어떻게 접근해야합니까? 다른 코드 구조를 사용해야합니까? 나는이 단점을 제외하고이 구조가 얼마나 단순하고 유지 보수가 잘되는지를 좋아한다.
* "그렇다면 내가 진짜 오류를 잡을 수 없게 될 것입니다."* 어떻게 그렇게? 내가 마지막으로 드라이버를 검사했을 때 오류 코드가있는 "유익한"구조화 된 오류 객체가 반환 되었기 때문에. 정규 패턴은 "중복 키 오류"에 "잉태/경고"입니다. 예외가 실제로는 치명적인 것은 아니지만 실제로 심각한 다른 데이터베이스 연결이 끊어지는 것과 같습니다. 그래서 전형적인 것은 할 일은 .catch()에서 "inspect"하고, 어떤 정보를 가지고 있는지에 따라'err'을 어떻게할지 결정합니다. 따라서 새로운 오류()를 던져서 식별하십시오. ** IS ** 할 일은 옳습니다. –
오류, mongoose 오류, mongodb 오류가 발생할 수있는 데는 여러 가지 이유가 있습니다. 어떤 통합 구조를 사용해야합니까? 방금'''if (! err.domain) {// 이것은 진짜 오류입니다}''' 그런 식으로'''res.send()'''가 아닌 것을 배제하고 있습니다. Is 거기에 오류를 인식하는 더 나은 방법은? – Hafez
"몽구스 오류"같은 것이 없습니다. 이것은 "운전자에게 똑바로"입니다. 나는 방금 전 세계의 다른 것들이 포장 된 좋은 예를 보여주었습니다. 고의적 인 쓰기 오류를 직접 작성하고 리턴 된 오브젝트를 점검 한 다음, 정확히 같은 내용을 볼 수 있습니다. 당신도 똑같은 일을해야합니다. 예제에서 보았 듯이 ** 정규 ** 연습에서는 반환 된 오류 객체의 속성으로'err.code'를보고 중복 키'E11000'을 기대합니다. –