You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CORS选项回调函数调用主体及错误传递机制技术问询

问题与代码

CORS 配置代码

const whitelist = ['https://www.yoursite.com', 'http://127.0.0.1:5500', 'http://localhost: 3500'];

const corsOptions = {
   origin: (argOrigin, argCallbackFx)=>{
      if(whitelist.indexOf(argOrigin) !== -1)
         argCallbackFx(null, true);       
      else       
         argCallbackFx(new Error('From server.js: Blocked by CORS'));      
   },
   optionsSuccessStatus: 200
}

app.use(cors(corsOptions));

app.use(errorHandler);

上述代码中的回调函数确已执行,这一点可通过errorHandler函数将传入argCallbackFx的错误信息写入日志文件得到验证。

疑问

  • 该回调函数由谁调用?调用来源是哪里?
  • 其传入的错误信息是如何传递到errorHandler中的?

我并未显式调用该回调函数,也未显式指定errorHandler接收回调函数的返回值。

错误处理器代码

const { loggerFx } = require('./logger');
const errorHandler = (argErr, argRequest, argResponse, next)=>{
    loggerFx(`${argErr.name}: ${argErr.message}`, 'errorLog.txt');
    argResponse.status(500).send(argErr.message);
 }
 module.exports = errorHandler;

解答
  1. 回调函数的调用者
    这个origin配置里的回调函数是由你引入的cors中间件内部调用的。当 Express 接收到跨域请求时,cors中间件会触发这个自定义的origin校验逻辑,自动传入请求的来源地址argOrigin,以及中间件自身提供的argCallbackFx回调函数。

  2. 错误信息传递到 errorHandler 的过程
    当你调用argCallbackFx(new Error(...))传入错误对象时,cors中间件内部会把这个错误对象传给 Express 的next()方法(即调用next(err))。而你注册的errorHandler是符合 Express 规范的错误处理中间件(它的参数是err, req, res, next四个,这是 Express 识别错误中间件的标志),Express 的请求处理流程会自动捕获通过next(err)传递的错误,并将错误对象交给errorHandler处理,所以你不需要显式传递,就能在errorHandler里拿到错误信息。


内容的提问来源于stack exchange,提问作者Aquarius_Girl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 20:47:25