节点 cors 捕获中间件回调错误

mih*_*lzi 4 error-handling node.js cors express

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

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));
Run Code Online (Sandbox Code Playgroud)

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

并发回 400 http 状态?

谢谢!

rom*_*lem 7

是的,这在错误处理下的 Express 文档中进行了解释。

Express 带有一个内置的错误处理程序,可以处理应用程序中可能遇到的任何错误。这个默认的错误处理中间件函数添加在中间件函数堆栈的末尾。

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

该文档不进入上的默认处理更多的细节,但在看源代码,默认的处理程序是被称为一个独立的模块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!')
})
Run Code Online (Sandbox Code Playgroud)

您在其他app.use()和路由调用之后最后定义错误处理中间件

所以在你的情况下,如果你想用 400 响应,你可以写这样的东西:

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

Express 还在其 repo 中包含一个示例服务器,显示此错误处理覆盖。