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

Posted

技术标签:

【中文标题】节点 cors 捕获中间件回调错误【英文标题】:Node cors catch middleware callback error 【发布时间】:2019-10-19 02:01:48 【问题描述】:

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

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

然后发回一个 400 http 状态?

谢谢!

【问题讨论】:

【参考方案1】:

是的,这在 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');
);

在其 repo 中也表达includes a sample server,显示此错误处理覆盖。

【讨论】:

非常感谢,这正是我想要的! 如果我们只把 cors(corsOptions) 放在特定的路线上,我们通常把它放在不同的文件夹中,例如/routes/index.js。如何将其“投入”到 app.js 文件中的错误处理中?

以上是关于节点 cors 捕获中间件回调错误的主要内容,如果未能解决你的问题,请参考以下文章

在 Node/Express 的异步函数中捕获错误

在使用 node.js 和 Express 构建的 api 中使用 cors 中间件时出现 CORS 错误

将本地 React 前端连接到本地 Spring Boot 中间件应用程序时出现 CORS 错误

招摇工具错误处理程序中间件未捕获错误

加载 Django runserver 提供的静态文件时如何修复 cors 错误

为啥 axios .catch() 在 redux 中间件中捕获 javascript 错误?