Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Firebase可调用函数+;科尔斯_Javascript_Firebase_Google Cloud Functions - Fatal编程技术网

Javascript Firebase可调用函数+;科尔斯

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

我试图从我的应用程序调用一个可调用的云函数,但我面临CORS问题。

我无法启用Cors,因为我无法访问onCall函数上的请求和响应。这是我的职责:

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函数有这个问题,但其他函数没有。我最终通过这样做修复了它:

  • 在index.js中注释函数
  • 正在运行firebase部署
  • 在提示下输入y以删除函数
  • 等待5到10分钟
  • 删除函数周围的注释并再次运行firebase deploy

  • 在功能本身没有任何更改的情况下,它现在运行时不会出现任何CORS问题。

    对于在现有GCloud项目上启用firebase后遇到此错误的用户,存在一些复杂性,如果它只是firebase应用程序,则不会自动处理

    我有这个特别的问题,因为我希望我的firebase功能可以公开访问,但是如果你使用google的云功能,你必须特别配置它

    以下是修复的步骤:

  • 转到“云功能”选项卡
  • 选择您的云功能(复选框)
  • 单击右侧权限选项卡下的“添加成员”
  • 输入“诱惑者”
  • 在“新成员”下,选择角色为“云函数->云函数调用器”
  • 拯救
  • 只需将云功能粘贴到浏览器中即可测试它

  • 干杯

    任何人都可以在2020年1月看到这篇文章

    在Reddit()上找到此答案

    事实证明,在2020年1月15日,谷歌改变了安全设置,所有新功能不再具有云函数调用器。这意味着所有新创建的功能都将被禁止访问,从而导致CORS策略阻塞

    下面是您如何修复它的,因为它并不那么明显:

  • 错误应如中所示
  • 我在更改了函数名后部署了可调用函数,并且它正在工作

  • 如果上述任何一项都没有帮助:
    在我的例子中,原因是我没有正确设置我的区域。这在使用第三方库时尤其可能发生。

    我以前将我的函数部署为HTTP函数(
    https.onRequest
    ),然后切换到可调用函数(
    https.onCall
    )。Firebase未识别出此更改


    我通过删除该函数并在不使用该函数的情况下进行部署来解决问题,然后将该函数放回并再次部署。

    对于来到这里搜索firebase可调用函数cors错误的任何其他人,我的清单如下:

  • 确保已部署该功能
  • 确保函数名正确。我在调用
    重新计算
    时,它本应该是
    重新计算
    。由于某种原因出现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…
    vs
    firebase.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
        }});