2015-02-08 7 views
6

Ho un modulo e quando qualcosa non va subito dopo l'invio, voglio essere in grado di dare all'utente specifici messaggi di errore. Sto usando Sequelize come mio ORM, e le promesse restituite stanno diventando un po 'confuse con tutto il codice annidato.Un modo per prevenire il codice altamente annidato in Sequenza per la gestione degli errori?

Per esempio, se abbiamo due modelli: per aggiornare User e 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}); 
}); 

E se ho 10 campi del modulo per aggiornare, tutto il codice nidificato può diventare prepotente.

Quali raccomandazioni possono essere fornite se desidero avere descrizioni di errori specifiche, ma anche codice più leggibile? Sarebbe possibile catturare tutti gli errori 404 e 500 in un blocco di codice invece di romperli come ho fatto io?

risposta

9

Si può fare uso della promessa concatenamento e di un metodo di supporto per ridurre il codice per una serie di 3 .then s ed una singola .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}); 
    });