2015-02-08 13 views
6

Mam formularz, a gdy coś nie pójdzie zaraz po przesłaniu, chcę móc podawać użytkownikom komunikaty o błędach. Używam Sequelize jako mojego ORM, a obietnice zwrócone stają się trochę niechlujne ze wszystkimi zagnieżdżonymi kodami.Sposób zapobiegania wysoce zagnieżdżonemu kodowi w funkcji Sequelize w celu obsługi błędów?

Na przykład, jeśli mamy dwa modele UPDATE: User i Photo:

models.User.find({where: {name: 'bob' }}).then(function(user) { 
    if(user) { 
     user.updateAttributes({email: email}).then(function(user) { 
      models.Photo.find({where: { hash: hash}}).then(function(photo) { 
       if(photo) 
        res.json({"message":"updated"}); 
       else 
        res.status(404).json({"error": "Could not find Photo"}); 
      }).catch(err) { 
       res.status(500).json({"error": err}); 
      }); 
     }).catch(function(err) { 
      res.status(500).json({"error": err}); 
     }); 
    } else { 
     res.status(404).json({"error": "Could not find user"}); 
    } 
}).catch(function(err) { 
    res.status(500).json({"error": err}); 
}); 

A jeśli mam 10 pól w formularzu, aby aktualizować, cały kod zagnieżdżony może stać apodyktyczny.

Jakie zalecenia można podać, jeśli chcę mieć określone opisy błędów, ale także bardziej czytelny kod? Czy byłoby możliwe przechwycenie wszystkich błędów 404 i 500 w jednym bloku kodu, zamiast rozbijania ich tak jak ja?

Odpowiedz

9

Można skorzystać z obietnicy łańcuchowych oraz sposobu pomocnika, aby zmniejszyć swój kod do serii 3 .then s oraz jednym .catch:

function notFoundError(model) { 
    var e = new Error('Could not find ' + model); 
    e.statusCode = 404; 
    throw e; 
} 

models.User 
    .find({where: {name: 'bob'}}) 
    .then(function (user) { 
     if (user) { 
      return user.updateAttributes({email: email}); 
     } else { 
      notFoundError('user'); 
     } 
    }) 
    .then(function (user) { 
     return models.photos.find({where: {hash: hash}}); 
    }) 
    .then(function (photo) { 
     if (photo) 
      res.json({"message": "updated"}); 
     else 
      notFoundError('photo'); 
    }) 
    .catch(function (err) { 
     if (err.statusCode) { 
      res.status(err.statusCode); 
     } else { 
      res.status(500); 
     } 
     res.json({'error': err.message}); 
    }); 
Powiązane problemy