使用onRequest云函数时出现CORS错误的原因及排查方案
报错原因
跨域配置失效的核心原因有两点:
- 你虽然引入了
cors依赖并做了初始化,但没有把cors中间件注册到请求处理流程中,这部分配置完全没有生效 - 手动设置
Access-Control-Allow-Origin的逻辑没有覆盖浏览器跨域场景自动发起的OPTIONS预检请求,预检请求无法拿到合规的CORS响应头时,浏览器会直接拦截请求抛出跨域错误。
修复方法
二选一即可:
方案1:使用cors中间件(推荐)
不要混用手动配头和cors中间件,直接把业务逻辑包裹在cors中间件的回调中,cors会自动处理所有跨域逻辑包括OPTIONS预检响应:
const cors = require('cors')({origin: true}); export const testFunction = functions.https.onRequest((req, res) => { cors(req, res, () => { const text = req.body.text; res.send({text: text}); }); });
方案2:手动配置CORS头
如果不想引入第三方依赖,需要单独拦截OPTIONS请求并返回对应CORS头:
export const testFunction = functions.https.onRequest((req, res) => { res.set("Access-Control-Allow-Origin", "*"); res.set("Access-Control-Allow-Methods", "GET, POST, OPTIONS"); res.set("Access-Control-Allow-Headers", "Content-Type"); // 预检请求直接返回204,不执行业务逻辑 if (req.method === "OPTIONS") { return res.status(204).send(""); } const text = req.body.text; res.send({text: text}); });
补充排查点:如果云函数前置了API网关、CDN或者WAF服务,需要确认这些服务没有拦截OPTIONS请求,否则即使云函数配置正确,预检请求也会被拦截导致跨域报错。
内容的提问来源于stack exchange,提问作者Daniel Spiers
相关产品推荐
相关产品推荐

