Mongoose错误不会从路由器升级到应用程序

时间:2018-01-18 08:22:42

标签: node.js express mongoose express-router

这样的单一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) })

这种行为对于没有完全承诺暗示的猫鼬是否正常,或者它可能以另一种方式被篡改?

使用savefind等其他方法时,不会引发错误。

1 个答案:

答案 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));
     });
 });