【发布时间】:2021-03-18 07:35:55
【问题描述】:
我遇到了 Firebase 和 COR 的问题,显然它无法到达端点并出现以下错误:
访问获取地址 'https://europe-west2-XXX.cloudfunctions.net/fetchChatToken' 来自原产地“https://trato.app”已被 CORS 政策阻止: 对预检请求的响应未通过访问控制检查:否 请求中存在“Access-Control-Allow-Origin”标头 资源。如果不透明的响应满足您的需求,请设置请求的 模式为“no-cors”以获取禁用 CORS 的资源。 service.ts:203
发布 https://europe-west2-XXX.cloudfunctions.net/fetchChatToken net::ERR_FAILED(匿名)@service.ts:203 ... ...
error.ts:66 Uncaught (in promise) 错误:内部 在新的 t (error.ts:66) 在错误.ts:175 吃。 (service.ts:276) 在 tslib.es6.js:100 在 Object.next (tslib.es6.js:81) 在 (tslib.es6.js:71)
我还检查了开发检查器 (chrome) 上的网络选项卡以检查 CORS 标头是否存在,我没有看到它。
另外,我一直在检查 firebase 函数日志,显然甚至没有被调用,最后一行显示的是部署。
我使用它的方式是这样的:
前端:
const functions = firebaseApp.functions('europe-west2');
export const fetchChatToken = async () => (await functions.httpsCallable('fetchChatToken')()).data;
函数(后端)端:
const ensureAuthentication = auth => { if (!auth) throw new HttpsError("unauthenticated", "authentication required"); };
exports.fetchChatToken = functions.region("europe-west2").https.onCall((data, context) => {
ensureAuthentication(context.auth);
try {
const { AccessToken } = twilio.jwt;
const { ChatGrant } = AccessToken;
const grant = new ChatGrant({
serviceSid: conversationsid
});
const token = new AccessToken(accountsid, apikey, apisecret);
token.addGrant(grant);
token.identity = context.auth.uid;
return token.toJwt();
} catch (error) {
console.error(error);
throw new HttpsError("internal", "internal error");
} });
【问题讨论】:
-
可调用函数在内部自动使用 cors,而您实际上无法控制它。请编辑问题以显示未按预期方式工作的代码。
-
@DougStevenson 我发现错误不在 firebase 预览频道中,它也在默认托管中。它无处不在,但不在模拟器中。已编辑。
-
函数端的错误日志是怎么说的?
-
在模拟器上运行它,没有错误,工作完美,部署在firebase中没有打印任何日志或调用,它只是没有被调用,我可以看到最后一个日志在部署时间(我重新部署也可以尝试)还有con错误选项卡,它没有显示任何错误,但正如所说,这些函数没有被aparently调用。
标签: firebase google-cloud-functions cors firebase-hosting