0

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

对于未完成 Promise 实现的猫鼬,这种行为是否正常,或者它可以以其他方式实现?

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

4

1 回答 1

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));
     });
 });
于 2018-01-18T09:24:37.593 回答