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

4
我有以下代码来检查来源头并允许访问,使用的是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));

请问是否有办法捕获“new Error”回调?

然后发送回400 HTTP状态码?

谢谢!

1个回答

7

是的,这在Express文档的错误处理下有解释。

Express内置了一个错误处理程序,可以处理应用程序中可能遇到的任何错误。此默认错误处理middleware函数被添加到middleware函数堆栈的末尾。

如果你通过next()传递了一个错误,并且你没有在自定义错误处理程序中处理它,它将被内置的错误处理程序处理;该错误将写入客户端并包含堆栈跟踪。生产环境不包括堆栈跟踪。

文档对默认处理程序没有进一步详细说明,但是通过查看源代码,默认处理程序是一个名为finalhandler的单独模块。

无论如何,要覆盖此处理程序,请参阅Express文档中标题为编写错误处理程序的部分。

它解释了:

Define error-handling middleware functions in the same way as other middleware functions, except error-handling functions have four arguments instead of three: (err, req, res, next). For example:

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

You define error-handling middleware last, after other app.use() and routes calls

所以在您的情况下,如果您想要响应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');
});

Express也在其repo中包括一个示例服务器,展示了此错误处理的覆盖。


非常完美,谢谢!这正是我所需要的! - miholzi
如果我们只在特定路由上放置cors(corsOptions),而通常会将其放置在不同的文件夹中,例如/routes/index.js。如何将其“抛出”到app.js文件中的错误处理中? - ryanadhi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接