2016-08-18 2 views
1

다음과 같은 매우 기본적인 마이그레이션 코드가 있습니다. 그것은 테이블을 제거하고, 테이블을 생성하고, 일부 데이터로 시드합니다.NodeJS/Express의 올바른 오류 처리

this.knex.schema.dropTable(this.tableName) 
.catch((err) => console.log(err)) 
.then(() => { 
    this.knex.schema.createTable(this.tableName, function(table) { 
     table.increments("id").primary(); 
     table.string("name"); 
     table.integer("parent_id").unsigned().default(0); 
    }) 
    .catch((err) => console.log(err)) 
    .then(() => { 
     this.categories.forEach((category) => { 
      Category.create(category) 
      .catch((err) => console.log(err)) 
      .then((category) => console.log(category.get("name") + " seeded.")) 
     }); 
    }); 
}); 

알다시피 코드에는 3x .catch((err) => console.log(err)) 연쇄가 있습니다.

지금 당장 Bugsnag를 내 응용 프로그램에 통합 시켰습니다. 모든 버그를 해결할 수 있도록 Bugsnag에 모든 예외/오류를 올바르게 기록하고 싶습니다. 그러나 지금 당장 할 수있는 일은 콘솔에 기록하는 것뿐입니다. 더 나쁜 것은, 나는 자신을 반복하고 각 catch 블록의 논리를 복제합니다.

나는이 같은 일을 생각 해요 : 또 다른 문제를 abrings

.catch((err) => ErrorHandler.add(err)) 

class ErrorHandler { 

    add(err) { 
     // Notify Bugsnag 
     // Log it to console 
    } 

} 

합니다. catch 메서드를 추가하는 것을 잊어 버린 경우에도 여전히 작동하지 않습니다. 또한,이 같은 일을 대한

생각 : 나는 모든 오류를 잡아 내 코드 건조하지만, 노드가 후킹 예외를 지원하는지 잘 모르겠습니다 수

// Change exception behaviour so whenever they are called, they raise an `onException` event 
app.listen("onException", (err) => { 
    // Notify Bugsnag 
    // Log error to console 
}); 

이런 식으로.

내 경우에는 무엇을 할 것이며 어떤 접근 방식을 취해야합니까? 모든 오류가 Bugsnag에 제대로 보내지는지 확인하고 싶습니다.

답변

1

우선 무엇입니까 this.knex.schema.createTable 약속을 반환합니까? 그래서 당신은 조금 청소기 방법으로이 논리를 작성할 수있는 경우와 같이, (당신은 항상 변환 할 수없는 경우, 약속을 반환) : 배열에서 어떤 약속을 거부 할 경우, 거부 약속을 반환합니다

this.knex.schema.dropTable(this.tableName) 
.then((...) => { 
    ... 
    return this.knex.schema.createTable(...) 
}) 
.then((...) => { 
... // do whatever you are doing with table object 
    return Promise.all(map and do whatever you are doing with categories) 
}) 
.then(() => { 
    // log that everything went well with seeding 
}) 
.catch((err) => { 
    // single catch block to handle errors from this promise chain 
}) 

Promise.all 당신이 경우 이 사용자의 요구 스위트하지 않는 것이, 당신은 블루 버드에서 .reflect()을 사용할 수 있습니다 찾을 (뭔가가, http://bluebirdjs.com/docs/api/reflect.html 나던 노드의 기본 약속 지원) 사용을 고려할 수

둘째, 대신 CONSOLE.LOG의 (console.error 또는 무엇이든) 번니 같은 것 https://github.com/trentm/node-bunyan

셋째, 일반적으로 당신은 항상 내가 캐치 방법을 코드에서 버그 것입니다 내 관점에서

를 추가 잊고 경우에 당신이 알 필요가 무엇

process.on('uncaughtException', (err) => { 
    ... 
}) 

처럼 uncaughtException으로부터 응용 프로그램을 보호하기 위해 필요 그것의. 이 같은 콜백에서 오류를 처리하는 것을 잊지처럼이 동일합니다 아니라 단순히 오류를 처리하지 않는 넣어,

doSomething((err, data) => { 
    // do something with data without checking against err 
}) 

그래서 같은 질문을 질문 할 수 What if I forget to check against err. 엄지의 규칙은 모든 것이 잘되는 것처럼 화창한 날 시나리오만을 테스트하지 않습니다. 비오는 날 시나리오를 포함하여 코드에서 여러 시나리오를 테스트하여 적절한 방식으로 처리해야합니다.

또한 혜택을 얻을 수있는 것이 하나 더 있습니다. Express을 질문에 언급했습니다.특별한 오류 처리 로직이 아닌 경우 (이 핸들러에 return next(err)를 통해 오류를 전달할 수있는 모든 경로에서이와

app.use((err, req, res, next) => { 
    ... 
}) 

: 당신은 당신과 같은 모든 루트 후 정의 할 필요가 전역 오류 핸들러를 등록 할 수 있습니다 필요한, 특정 엔드 포인트에 따라 다름) 로그 오류와 같은 오류를 처리 할 수있는 장소를 확보하고 메시지가 포함 된 500을 반환하십시오. https://expressjs.com/en/guide/error-handling.html

+0

놀라운 대답을 보내 주셔서 감사합니다. createTable이 약속을 반환하지 않으면 약속을 반환하기 위해 어떻게 변환 할 수 있습니까? 또한 Bluebird는 정확히 무엇이며 어레이 맵 완성을 어떻게 이해합니까? 지금은 단지 다른 종류의'save (...), then (...)'약속들입니다. 언젠가 언젠가는 약속을 읽어야 할 것 같아요. 이것에 관해 당신이 제안 할 수있는 것이 있습니까? – Aris

+0

당신의 추측은 정확합니다. 먼저 도움이 될만한 약속에 익숙해 져야합니다. https://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html – Srle

+0

읽었습니다. 그것. 대부분의 내 질문에 답합니다. 그러나, 나는 이것을 어떻게 약속 할 수 있을지 확신하지 못한다 :'this.knex.schema.createTable'. 또한 미래에 약속을 되풀이하지 않는 것을 약속해야한다면 어떻게 할 수 있습니까? 메소드를 오버라이드하고'Promise.something()'을 리턴 하시겠습니까? – Aris