Javascript Firebase可调用函数+;科尔斯
我试图从我的应用程序调用一个可调用的云函数,但我面临CORS问题。 我无法启用Cors,因为我无法访问onCall函数上的请求和响应。这是我的职责:Javascript Firebase可调用函数+;科尔斯,javascript,firebase,google-cloud-functions,Javascript,Firebase,Google Cloud Functions,我试图从我的应用程序调用一个可调用的云函数,但我面临CORS问题。 我无法启用Cors,因为我无法访问onCall函数上的请求和响应。这是我的职责: exports.UserInvitation = functions.https.onCall((data, context) => { const email = data.email return new Promise((resolve, reject) => { admin.auth().createUse
exports.UserInvitation = functions.https.onCall((data, context) => {
const email = data.email
return new Promise((resolve, reject) => {
admin.auth().createUser({
email: email,
emailVerified: false,
password: password
}).then(resolve).catch((err) => {
console.error(err.code)
reject(new functions.https.HttpsError(err.code, err.message))
})
})
})
我这样称呼它:
functions.httpsCallable('UserInvitation')({ email: this.input.value }).then((data) => {
console.log('Sent invitation:', data)
})
Firebase functions package.json:
{
"name": "functions",
"description": "Cloud Functions for Firebase",
"scripts": {
"serve": "firebase serve --only functions",
"shell": "firebase functions:shell",
"start": "npm run shell",
"deploy": "firebase deploy --only functions",
"logs": "firebase functions:log"
},
"dependencies": {
"bluebird": "^3.5.1",
"firebase-admin": "~5.12.0",
"firebase-functions": "^1.0.1"
},
"private": true
}
WEB SDK Firebase版本:4.13.1我的问题不是CORS,而是我的错误处理程序。我没有拒绝承诺,而是直接在catch处理程序中使用了
throw
catch((err) => {
throw new functions.https.HttpsError('unknown', err.message, err)
})
我的一些Firebase函数有这个问题,但其他函数没有。我最终通过这样做修复了它:
在功能本身没有任何更改的情况下,它现在运行时不会出现任何CORS问题。对于在现有GCloud项目上启用firebase后遇到此错误的用户,存在一些复杂性,如果它只是firebase应用程序,则不会自动处理 我有这个特别的问题,因为我希望我的firebase功能可以公开访问,但是如果你使用google的云功能,你必须特别配置它 以下是修复的步骤:
干杯任何人都可以在2020年1月看到这篇文章 在Reddit()上找到此答案 事实证明,在2020年1月15日,谷歌改变了安全设置,所有新功能不再具有云函数调用器。这意味着所有新创建的功能都将被禁止访问,从而导致CORS策略阻塞 下面是您如何修复它的,因为它并不那么明显:
如果上述任何一项都没有帮助:
在我的例子中,原因是我没有正确设置我的区域。这在使用第三方库时尤其可能发生。我以前将我的函数部署为HTTP函数(
https.onRequest
),然后切换到可调用函数(https.onCall
)。Firebase未识别出此更改
我通过删除该函数并在不使用该函数的情况下进行部署来解决问题,然后将该函数放回并再次部署。对于来到这里搜索firebase可调用函数cors错误的任何其他人,我的清单如下:
重新计算
时,它本应该是重新计算
。由于某种原因出现cors错误europe-west2
。我必须使用该区域部署函数,并使用该区域调用它。有一段时间,我假设如果函数名称正确,客户端将推断出正确的区域。事实并非如此// This is the file in which you define your callable function.
const functions = require('firebase-functions');
...
exports.yourFunc = functions.region('europe-west2').https.onCall(async (data, context) => {
...
})
从客户端调用特定区域中的函数(在本例中为vuejs web应用):
注意:
firebase.app().function…
vsfirebase.app.function…
可能很多人会通过emulator和cors消息遇到这个问题
我在谷歌看到的任何讨论中都没有看到我的案例被讨论过,我确实看到了很多“无法复制”,也许我的案例会给一些启示:
在我的例子中,问题是我没有从firebase emulator运行主机
当您通过npm start运行react应用程序时-当功能通过firebase模拟器:start运行时,您将看到Cors错误
因此,在测试云函数调用时,而不是使用npm start,您应该这样做
npm运行构建,然后从模拟器访问应用程序
搜索类似以下内容:
“宿主:本地服务器:”
几个音符-
- 您的函数也应该通过
const functions=firebaseApp.functions('europe-west3');//假设这是您所在的地区 useFunctionsEmulator('http://localhost:5000);
- 对我有效的方法是删除我的云函数中的区域参数,然后重新部署。
From
functions.region(“europe-west2”).https.onCall(异步(数据)=>{..
到functions.https.onCall(异步(数据)=>{..
我在尝试创建用于登录firebase用户的自定义令牌时遇到了相同的错误。
我在下面附上了我的代码。但是,我后来发现问题是由于试图创建多个令牌,使用相同的参数多次调用函数。
解决方案
我通过在尝试登录之前首先检查用户是否已注销来解决此问题。因此,我建议您首先检查您尝试创建的用户是否已经存在。 我知道这有点晚了,但我希望这对其他人有所帮助。 在firebase函数中,您可以按如下方式检查现有用户:
admin.auth().getUserByEmail('your-email').then((userExists) => {
if (userExists) {
// return user
} else {
// create a new user
}});
我也有同样的问题,我的解决方案是在 并导航到云功能页面
查找您的函数名,转到其权限页面,并向“allUsers”成员添加新角色“Cloud Functions Invoker”。基本上,我做了页面提示和答案中提到的关于o的CORS错误的所有事情
export const getCustomToken = functions.https.onCall((params: any) => {
return admin.auth().createCustomToken(params).then((token) => {
return token;
}).catch((error) => {
console.log(error);
return null;
});
});
this.fireAuth.currentUser.then((signedInAlready) => {
if (signedInAlready) {
return this.fireAuth.signOut().then(() => getCustomToken());
} else {
return getCustomToken();
}
});
admin.auth().getUserByEmail('your-email').then((userExists) => {
if (userExists) {
// return user
} else {
// create a new user
}});