这样的单一api应用程序:
const express = require('express')
const app = express()
const router = require('express').Router()
...
route.post('/dogs', (req, res, next) => {
const dog = new Dog() // it defined in real app
dog.validate() // error happens here
.then(() => {
return res.status(201)
})
// [1]
})
...
app.use('/api/v1', router)
app.use(notFoundErrorHandler)
app.use(globalErrorHandler)
function notFoundErrorHandler (req, res, next) {
res.status(404)
res.send({error: 'Not found'})
}
function globalErrorHandler (err, req, res, next) {
if (err) {
res.status(err.status || 500)
res.json({error: err.message || err})
}
}
如果出现验证错误,则无法传递给globalErrorHandler
,但捕捉和重新抛出错误可以解决问题[1]:
.catch(err => { return next(err) })
这种行为对于没有完全承诺暗示的猫鼬是否正常,或者它可能以另一种方式被篡改?
使用save
,find
等其他方法时,不会引发错误。
答案 0 :(得分:0)
多数民众赞成正常,是的,与猫鼬无关,但与Express有关。
Express不处理隐式的无法处理的异常,您必须明确处理它们。因此,在每条路线中,您必须捕获任何错误并将其传递给next
。
我知道这有时令人沮丧,所以我建议您创建一个路由管理器,它将使用动作处理程序和try / catch模式注册每个路由。
有很多例子,这里有一个我喜欢的简单。
var dogHandler = require('dogHandler')
var serverRoutes = [{
path: "dogs",
method: "post",
action: dogHandler
}]
serverRoutes.forEach(route => {
app[route.method](route.path, (request, response, next) => {
route.action(request, response)
.then(() => next)
.catch(err => next(err));
});
});