2017-11-22 5 views
-2

DB에서 라우터 및 두 개의 acync 가져 오기가 있습니다. 오류를 잡는 올바른 방법은 무엇입니까?여기 어떻게 오류를 잡을 수 있습니까?

router.get('/restaurant/:id', async (req, res, next) => { 
    try { 
     let current_restaurant = await Restaurant.findOne({restaurantId: req.params.id}).exec(); 
     let products = await Product.find({restaurant: req.params.id}).exec(); 
     res.render('restaurant', { 
      user: req.user, 
      csrfToken: req.csrfToken(), 
      current_restaurant: current_restaurant, 
      products: products 
     }); 
    } catch(e) { 
     // do whatever you want 
     console.log(e); 
     res.sendStatus(500); 
    } 
}); 

당신은 정기적으로 약속이를 비교할 수 있습니다 당신이 await을 사용하려고하는 경우

router.get('/restaurant/:id', async (req, res, next) => { 
    var current_restaurant = await Restaurant.findOne({restaurantId: req.params.id}).exec(); 
    var products = await Product.find({restaurant: req.params.id}).exec(); 

    res.render('restaurant', { 
     user: req.user, 
     csrfToken: req.csrfToken(), 
     current_restaurant: current_restaurant, 
     products: products 
    }); 
}); 
+0

async/await를 사용할 때 try/catch를 사용하면 오류를 catch 할 수 있습니다. 대부분의 문서/튜토리얼에 [MDN 코드] (https://developer.mozilla.org/en-US/docs/Web)가 표시됩니다./JavaScript/Reference/Statements/async_function # Rewriting_a_promise_chain_with_an_async_function) –

+2

마지막으로 투표하는 것을 알고 있지만 사람들이 가까운 투표를 통해 약간의 제한을 표시 할 수 있습니까? 내가 궁금해하는 질문은 최근에 전혀 이유가없는 투표 (또는 적어도 자신이 선택한 사람이 아님)에 가까운 투표를 가지고 있습니다. –

+3

분명히 너무 광범위하지는 않지만, OP는 적어도 자신이 시도/catch, async/await를 사용하여 오류 처리의 모든 예를 고려해보십시오. 그 질문은 가난하게 연구하게 만든다. 그것이 그 문제에 포함 되었다면, 이것은 아마도 중복 될 것입니다. –

답변

2

다음 중 하나를

try { 
    var current_restaurant = await Restaurant.findOne({restaurantId: req.params.id}).exec(); 
    var products = await Product.find({restaurant: req.params.id}).exec(); 

    res.render('restaurant', { 
     user: req.user, 
     csrfToken: req.csrfToken(), 
     current_restaurant: current_restaurant, 
     products: products 
    }); 
} catch (err) { 
    // Handle your errors here... 
} 

당신의 전형적인 패턴이다. 렌더링을 복구하고 계속할 수 있는지 여부 (기본값 또는 무언가 포함)에 따라 try 블록에 호출을 기다리고 try 블록 앞에 변수를 선언 할 수 있습니다.

그렇지 않으면 약속을 기다리고 있으므로 더 깨끗한 것으로 보이는 경우 약식 .catch 방법을 사용할 수 있습니다. 여전히 catch 코드 (기본 또는 대체 값의 예를 들면, 어떤 종류)에 유효한 뭔가를 반환 할 경우

var current_restaurant = await Restaurant.findOne({restaurantId: req.params.id}).exec() 
    .catch(err => { /* handle error here*/ }); 
var products = await Product.find({restaurant: req.params.id}).exec() 
    .catch(err => { /* handle error here*/ }); 

그러나,이 패턴에만 유용 될 것입니다. 오류가 발생했을 때 모든 것을 해결할 필요가있는 경우이 방법은 효과가 없으므로 이전에 언급 한 try/catch 패턴을 사용해야합니다.

2

, 당신은 당신이 대기하고 있던 약속 중 하나의 거부를 잡으려고 시도/캐치를 사용합니다 사용하여 프로그래밍 .then() : 당신이 데이터베이스 요청 이후

router.get('/restaurant/:id', async (req, res, next) => { 
    Promise.all([ 
     Restaurant.findOne({restaurantId: req.params.id}).exec(), 
     Product.find({restaurant: req.params.id}).exec() 
    ]).then([current_restaurant, products] => { 
     res.render('restaurant', { 
      user: req.user, 
      csrfToken: req.csrfToken(), 
      current_restaurant: current_restaurant, 
      products: products 
     }); 
    }).catch(e => { 
     // add your desired error handling here 
     console.log(e); 
     res.sendStatus(500); 
    }); 
}); 

서로 독립적는, 두 번째 버전은 DB 쿼리 수 parall 수 있습니다 실제로는 약간 더 빠르게 실행될 수 있습니다 (데이터베이스에 따라 다름).