Express CORS中间件可处理飞行前和正常请求



我有这样全局配置的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策略似乎凌驾于路线策略之上,但我认为只是在选项方法上。我正试图想出一种方法,使这两项CORS政策都能很好地发挥作用。我也尝试过以下方法,但这也不起作用。无论我把哪一个放在第一位,似乎都会压倒另一个。

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

我上面的第二个代码片段没有按预期工作的原因是,在应用程序级别设置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
}

啊,花了这么长时间才弄明白这个。希望这能节省一些时间。

最新更新