Firebase Cloud Functions启用CORS遇阻求助
解决Firebase Cloud Functions的CORS跨域问题
我之前也碰到过一模一样的问题!你已经用了cors库,但大概率是踩了几个常见的小坑,咱们一步步来搞定它:
确保业务逻辑被cors中间件正确包裹
你代码里的return co...看起来没写完,这很可能是问题核心。正确的做法是把所有请求处理逻辑放在cors的回调函数里,这样中间件才能正确添加CORS响应头。示例代码应该是这样:const functions = require('firebase-functions'); const cors = require('cors')({origin: true}); exports.foo = functions.https.onRequest((req, res) => { // 用cors包裹你的核心逻辑 cors(req, res, () => { // 这里写你的业务代码,比如返回数据 res.status(200).json({ message: "请求成功!" }); }); });别让函数提前终止(尤其是异步操作时)
如果你的函数里有异步操作(比如查Firestore、调用其他API),一定要等异步操作完成再返回响应。不然函数会提前结束,导致cors头还没加上就断了。用async/await处理异步的示例:const functions = require('firebase-functions'); const cors = require('cors')({origin: true}); exports.foo = functions.https.onRequest(async (req, res) => { cors(req, res, async () => { try { // 模拟异步操作,比如从数据库取数据 // const result = await db.collection('data').doc('test').get(); res.status(200).json({ success: true, data: {} }); } catch (err) { res.status(500).json({ error: err.message }); } }); });确认代码已经重新部署
有时候改了代码但忘了重新部署,旧的有问题的代码还在运行。记得执行部署命令:firebase deploy --only functions:foo不要手动处理OPTIONS预检请求
浏览器发送的OPTIONS预检请求,cors库会自动处理响应。如果你自己写了OPTIONS请求的处理逻辑,很可能会覆盖cors的配置,导致预检不通过。把OPTIONS的处理完全交给cors中间件就好。
如果你的请求需要带自定义头(比如Authorization)或者允许携带凭证,还可以调整cors的配置:
const cors = require('cors')({ origin: true, credentials: true, // 允许携带cookie等凭证 allowedHeaders: ['Authorization', 'Content-Type'] // 允许自定义头 });
按照上面的方法调整后,应该就能解决那个"Response to preflight request doesn't pass access control check"的错误了!
内容的提问来源于stack exchange,提问作者yoonicode
相关产品推荐
相关产品推荐

