2016-06-28 66 views
1

我有一個驗證數據並拋出錯誤的sequelize數據庫。異常的通用catch版本?

我知道我可以做這樣的事情來捕捉和輸出我的錯誤:

User.build() 
.catch(Sequelize.ValidationError, function (err) { 
      // respond with validation errors 
      return res.status(422).send(err.errors); 
     }) 
.catch(function (err) { 
     // every other error 
     return res.status(400).send({ 
      message: err.message 
     }); 

但我不想把它添加到每一個請求,就是在那裏搭上theese錯誤的一些通用的方法是什麼?

回答

1

您可以添加自定義的方法來req(或res),將解決的承諾和處理任何錯誤:

app.use((req, res, next) => { 
    req.resolve = (promise) => { 
    return promise.catch(Sequelize.ValidationError, err => { 
     // respond with validation errors 
     return res.status(422).send(err.errors); 
    }).catch(err => { 
     // every other error 
     return res.status(400).send({ message: err.message }); 
    }); 
    }); 
    next(); 
}); 

使用(前提是中間件上面的路線前加入):

router.post('/user', (req, res) => { 
    req.resolve(User.build()).then(user => res.json(user)); 
}); 
1

ES.next版本(2016)

您可以使用異步函數0123使用從官方strongloop網站複製此包裝函數:

let wrap = fn => (...args) => fn(...args).catch(args[2]); 

然後作出這樣在你的路由器/控制器的功能:

router.post('/fn/email', wrap(async function(req, res) { ...throw new Error(); } 

終於有一個正常捕獲所有錯誤中間件:

app.use(function(err, req, res, next) { console.log(err); } 

顯然這個工作你需要babel譯員目前

+0

你說的這個寶貝是什麼? – Himmators

+1

閱讀我更新的評論。如果你正在編寫任何JavaScript代碼,你至少應該知道現在的babel – arisalexis