我有这样全局配置的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
}
啊,花了这么长时间才弄明白这个。希望这能节省一些时间。