我有一个通用的云函数:
const functions = require('firebase-functions');
const cors = require('cors')({ origin: true });
exports.helloWorld = functions.https.onRequest((request, response) => {
cors(request, response, () => {
res.status(200).send("Hello from Firebase!");
});
});
我从一个使用axios的客户那里调用它:
axios
.get(
"https://us-central1-dev-imcla.cloudfunctions.net/helloWorld",
)
.then((res) => {
console.log(res);
})
.catch(er=>{
console.log(er);
})
我有两个问题:
- 我得到CORS错误
访问XMLHttpRequest'https://myurl/helloWorld'来自原点'http://localhost:8080'已被CORS策略阻止:否请求的上存在"Access Control Allow Origin"标头资源xhr.js?b50d:178获取https://us-central1-dev-imcla.cloudfunctions.net/helloWorldnet::ERR_FAILED
- 如果我从浏览器打开cors插件,或者如果我从邮递员那里调用函数,我会收到这个错误:
错误:禁止您的客户端没有获取URL的权限/来自该服务器的helloWorld。
错误:请求失败,状态代码为403在createError(createError.js?2d83:16(结算时(sett.js?467f:17(在XMLHttpRequest.handleLoad(xhr.js?b50d:61(
问题是,我既是经过身份验证的用户,而且我在云代码中有cors包。
可能与CORS无关。检查firebase函数日志,看看您的代码中是否有任何错误。
https://stackoverflow.com/a/51103084/5781575
需要添加以下内容来处理云功能中的CORS请求:
exports.corsEnabledFunction = (req, res) => {
// Set CORS headers for preflight requests
// Allows GETs from any origin with the Content-Type header
// and caches preflight response for 3600s
res.set('Access-Control-Allow-Origin', '*');
if (req.method === 'OPTIONS') {
// Send response to OPTIONS requests
res.set('Access-Control-Allow-Methods', 'GET');
res.set('Access-Control-Allow-Headers', 'Content-Type');
res.set('Access-Control-Max-Age', '3600');
res.status(204).send('');
} else {
res.send('Hello World!');
}
};
你可以试试这个例子。这是guthub repo,其中是完整的代码。