Firebase 云功能 - onCall 不起作用
Posted
技术标签:
【中文标题】Firebase 云功能 - onCall 不起作用【英文标题】:Firebase Cloud Functions - onCall not working 【发布时间】:2018-10-16 04:11:15 【问题描述】:我正在测试 FB 文档 (https://firebase.google.com/docs/functions/callable) 中描述的一个非常简单的实现,但它不起作用。
这是我部署到云端的 Firebase 函数:
exports.getRecSkills = functions.https.onCall((data, context) =>
return text: data.text;
);
...和我的客户调用(在初始化 FB 之后):
var getRecSkills = firebase.functions().httpsCallable('getRecSkills');
getRecSkills(text: '123').then(function(result)
console.log(result);
).catch(function(error)
console.log(error.code);
console.log(error.message);
);
我遇到了一个与 CORS 标头相关的问题,但在文档中,它没有提到对 CORS 的需求……我错过了什么吗?
一些注意事项:
我已经能够执行其他 Firebase 功能(即 HTTPS、 数据库),所以我不认为是我错误地设置了 Firebase。 已更新到最新的 Firebase,所以也不要认为这是个问题。 给我一个“内部”错误,除了“出现严重错误”之外,API 文档没有帮助。 我似乎无法使该功能正常工作(它一直给我 400 错误)通过 shell 进行本地测试时,即使我知道了 与任何其他数据库和 https 函数一起使用为此苦苦挣扎了很长一段时间...请帮助!
【问题讨论】:
您使用的是什么版本的客户端和节点 SDK? 我正在使用最新的 - FB 客户端 (v4.13.1) 和 FIrebase 管理员 (v5.12.0) 你在服务器上使用的是什么版本的 firebase-functions? 我正在使用 v1.0.2(最新)将我的功能部署到 Firebase,这就是我假设您要问的? 我看到你忘记用 projectId 初始化你的配置了。你的 URL 上有“未定义” 【参考方案1】:要消除您的CORS
错误,请确保您的firebase.json
具有以下headers
:
"hosting": [
"headers": [
"source": "**",
"headers": [
"key": "Access-Control-Allow-Origin",
"value": "*"
]
]
]
如果您在本地设备上运行 Firebase Emulator,请确保在初始化 Firebase 函数后具有以下内容,否则您的本地设备仍将调用远程 Firebase 函数,而您将再次遇到CORS
错误:
if (window.location.hostname === "localhost")
console.log("localhost detected!");
firebase.functions().useFunctionsEmulator('http://localhost:5001');
;
【讨论】:
【参考方案2】:我最近遇到了同样的问题,但在我的配置对象中包含我的“projectId”后解决了它。下面是 javascript 的 Firebase 配置对象的代码 sn-p。确保所有字段都已填写在您的配置对象中,它应该可以解决您未定义的问题。
var config =
apiKey: "<API_KEY>",
authDomain: "<PROJECT_ID>.firebaseapp.com",
databaseURL: "https://<DATABASE_NAME>.firebaseio.com",
projectId: "<PROJECT_ID>",
storageBucket: "<BUCKET>.appspot.com",
messagingSenderId: "<SENDER_ID>",
;
【讨论】:
【参考方案3】:如果您有CORS
问题并且您使用express
来公开您必须允许cors 的API 函数:
import * as cors from 'cors';
import * as express from 'express';
const corsHandler = cors(origin: true);
const app = express();
app.use(corsHandler);
app.post('/createUser', async (request, response) =>
await createUser(request, response);
);
exports.api = functions.https.onRequest(app);
【讨论】:
以上是关于Firebase 云功能 - onCall 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Firebase https onCall 功能被 cors 阻止
Firebase + Flutter - 云函数 onCall 导致 Android 应用出现“未经身份验证”错误
错误:响应不是具有 onCall 的 firebase 函数上的有效 JSON 对象