2016-02-11 8 views
13

Używam Sequelize ORM w węźle/Express.Gdzie obsłużyć błąd w kontynuacji instrukcji zapytania ORM?

Mam dwie tabele, Użytkownik i przedmiot. Produkt ma klucz obcy powiązany z UserId.

Kiedy próbuję utworzyć element z nieprawidłowym ID użytkownika (nieobecny w tabeli Użytkownicy), generowany jest komunikat "SequelizeForeignKeyConstraintError" i prowadzi do awarii aplikacji z powodu nieobsłużonego.

Mam problem jest taki:

Gdzie mogę obsłużyć błąd?

Oto mój kod.

.post(function(req,res){ 
     models.Item.create({ 
      title : req.body.title, 
      UserId : req.body.UserId 
     }).then(function(item){ 
      res.json({ 
       "Message" : "Created item.", 
       "Item" : item 
      }); 
     }); 
    }); 

Odpowiedz

16

Jeśli chcesz obsługiwać konkretny błąd, dołącz .catch obsługi

models.Item.create({ 
    title : req.body.title, 
    UserId : req.body.UserId 
}).then(function(item){ 
    res.json({ 
    "Message" : "Created item.", 
    "Item" : item 
    }); 
}).catch(function (err) { 
    // handle error; 
}); 

Jeśli chcesz bardziej ogólnie obsługi błędów (tj pokazać piękny komunikat o błędzie, zamiast zabić serwer, ty chcieć rzucić okiem na unhandledexception

https://nodejs.org/api/process.html#process_event_uncaughtexception

Jeśli używasz Express, zawiera ona również pewne ERR i przeładunku, http://expressjs.com/en/guide/error-handling.html

+10

Jeśli chcesz złapać konkretny błąd SequelizeForeignKeyConstraintError można przekazać go do funkcji catch '.catch (Sequelize.SequelizeForeignKeyConstraintError, funkcji (ERR) {// uchwyt onky kluczy obcych błędów; }); ' –

+0

czy możliwe jest obsłużenie wszystkich błędów ORM przez status HTTP 500 i domyślną obsługę błędów w trybie ekspresowym? tak naprawdę nie chcę dodawać '.catch (err => {next (err)});' ilekroć trafiam do bazy danych. –