【问题标题】:Express CORS middleware to handle both preflight and normal requestsExpress CORS 中间件来处理预检和正常请求
【发布时间】:2021-11-30 12:05:35
【问题描述】:

我已经像这样全局配置了 CORS,以处理凭据:

app.use(cors({ origin: 'https://example.com', credentials: true }))

但在某些路线上,我需要允许选项请求,所以按照文档,我正在做这样的事情:

router.options('/someroute', cors())
router.get('/someroute', cors(), someOtherMiddleware, async (req, res) => {
  // do stuff
}

我认为我的全局 CORS 策略似乎覆盖了路由策略,但仅限于 options 方法。我试图想出一种方法来使这两种 CORS 策略都能很好地发挥作用。我也尝试了以下方法,但这也不起作用。无论我先放哪一个似乎都会覆盖另一个。

app.options('*', cors())
app.use(cors({ origin: 'https://example.com', credentials: true }))

【问题讨论】:

  • cors 中间件by default sets up a global OPTIONS handler。您是说要为某些路线禁用它吗?
  • 如果我理解正确,在我设置特定来源的app.use() 中,是否使所有选项请求都需要该来源?如果是这样,那么是的,我需要为特定路由禁用它并允许选项请求的所有来源。
  • “是所有选项请求都需要那个来源吗?” 是的,对于所有跨域请求。虽然请求方法并没有真正进入它
  • app.use() 涵盖所有类型的请求,包括 GET、PUT、POST、OPTIONS、HEAD、DELETE 等。
  • 我真的不知道您在这里寻求帮助的问题是什么。如果您在所有路线之前指定了此app.use(cors({ origin: 'https://example.com', credentials: true })),那么它将首先生效,并且如果它被配置为仅自动为您处理飞行前请求,那么它只会处理它并且没有其他路线将获得有机会看看。 Express 路由和中间件按照它们声明的顺序进行处理。

标签: javascript express cors middleware


【解决方案1】:

我上面的第二个代码 sn-p 没有按预期工作的原因是因为我需要在应用级别设置 cors 策略时添加 preflightContinue 属性。否则,它将忽略在路由级别设置的选项路由上的 cors 策略。一种记录不充分的东西。

最终的解决方案是在应用级别执行此操作:

app.use(cors({ 
  origin: 'https://example.com', 
  credentials: true,
  preflightContinue: true,
}))

现在这个选项路由上的 cors 策略确实有效:

router.options('/someroute', cors())
router.get('/someroute', cors(), someOtherMiddleware, async (req, res) => {
  // do stuff
}

呃,花了这么长时间才弄清楚这一点。希望这可以节省一些时间。

【讨论】:

    猜你喜欢
    • 2014-10-31
    • 1970-01-01
    • 2019-08-29
    • 2016-02-17
    • 2012-11-17
    • 2013-11-25
    • 2014-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多