Node Cors捕获中间件回调错误

时间:2019-06-03 13:43:43

标签: node.js express error-handling cors

我有以下代码,使用express和npm cors插件来检查原始标头并允许访问

babel-core@6.26.3

现在,我想知道是否有办法捕获“新错误”回调?

并发送回400 http状态?

谢谢!

1 个答案:

答案 0 :(得分:3)

是的,这在Express文档的Error Handling下进行了解释。

  

Express带有内置的错误处理程序,该错误处理程序可以处理应用程序中可能遇到的任何错误。默认的错误处理中间件功能已添加到中间件功能栈的末尾。

     

如果将错误传递给next(),并且没有在自定义错误处理程序中进行处理,则它将由内置错误处理程序进行处理;错误将与堆栈跟踪一起写入客户端。堆栈跟踪不包含在生产环境中。

文档中没有提供关于默认处理程序的更多详细信息,但是在looking at the source code之后,默认处理程序是一个名为finalhandler的单独模块。

无论如何,要覆盖此处理程序,请参阅Express文档中标题为Writing error handlers的部分。

它说明:

  

以与其他中间件功能相同的方式定义错误处理中间件功能,除了错误处理功能具有四个参数而不是三个参数:(err, req, res, next)。例如:

app.use(function (err, req, res, next) {
  console.error(err.stack)
  res.status(500).send('Something broke!')
})
     

您先定义错误处理中间件,然后再定义其他app.use()并路由调用

因此,在您的情况下,如果您想回复400,则可能会这样写:

const app = express();
const cors = require('cors')
var corsOptions = {
    origin: function (origin: any, callback: any) {
        if (!origin || whitelist.indexOf(origin) !== -1) {
            callback(null, true)
        } else {
            callback(new Error('Not allowed by CORS'))
        }
    }
}
app.use(cors(corsOptions));

// This overrides the default error handler, and must be called _last_ on the app
app.use(function customErrorHandler(err, req, res, next) {
   res.status(400).send('Your custom error message here');
});

在其仓库中还表达了includes a sample server,显示了erorr处理的覆盖。