Firebase函数在一个Firebase项目中运行,但在另一个项目中出现内部错误

Firebase函数在一个Firebase项目中运行,但在另一个项目中出现内部错误,firebase,google-cloud-functions,Firebase,Google Cloud Functions,我有两个firebase帐户,一个用于开发(D),另一个用于生产(p)。我的开发(D)firestore和功能在us-central1上运行。在生产阶段(P),firestore位于亚洲南部1,功能在美国中部1上运行 我的firebase函数在开发(D)中正常运行,但在生产中出现以下错误。此外,当我检查firebase functions控制台上的日志时,似乎没有任何活动。似乎该函数尚未被调用 firebase函数返回的错误为: 函数调用错误Fri Apr 09 2021 09:25:32 GM

我有两个firebase帐户,一个用于开发(D),另一个用于生产(p)。我的开发(D)firestore和功能在us-central1上运行。在生产阶段(P),firestore位于亚洲南部1,功能在美国中部1上运行

我的firebase函数在开发(D)中正常运行,但在生产中出现以下错误。此外,当我检查firebase functions控制台上的日志时,似乎没有任何活动。似乎该函数尚未被调用

firebase函数返回的错误为:

函数调用错误Fri Apr 09 2021 09:25:32 GMT+0530(印度标准时间),带有{“代码”:“内部”}

此外,客户端还显示以下消息:

在'https://us-central1-xxx.cloudfunctions.net/gpublish“起源”https://setmytest.com'已被CORS策略阻止:对飞行前请求的响应未通过访问控制检查:请求的资源上不存在'access control Allow Origin'标头。如果不透明响应满足您的需要,请将请求的模式设置为“no cors”,以获取禁用cors的资源。zone evergreen.js:1052 POST net::ERR_失败

下面是我的angular应用程序调用函数的代码-

const process = this.fns.httpsCallable("gpublish");
process(data).subscribe(
  (result) => {
    console.log("function responded with result: " + JSON.stringify(result));
  },
  (err) => {
    const date1 = new Date();
    console.log("Function call error " + date1.toString() + "with" + JSON.stringify(err));
  });
下面是函数-

索引

import { gpublish } from "./gpublish/gpublish";
import { sendEmail } from "./sendEmail";

export {gpublish,sendEmail };
gpublish.ts

import * as functions from "firebase-functions";
const fs = require("fs");
const { google } = require("googleapis");
const script = google.script("v1");
const scriptId = "SCRIPT_ID";
const googleAuth = require("google-auth-library");
import { admin } from "../admin";
const db = admin.firestore();

export const gpublish = functions.https.onCall(async (data: any, res: any) => {
  try {
    const googleTest = data.test;
    console.log("Publishing to google test of name " + googleTest.testName);
    
    // read the credentials and construct the oauth client
    const content = await fs.readFileSync("gapi_credentials.json");
    const credentials = JSON.parse(content); // load the credentials
    const { client_secret, client_id, redirect_uris } = credentials.web;
    const functionsOauth2Client = new googleAuth.OAuth2Client(client_id,client_secret, redirect_uris); // Constuct an auth client
    functionsOauth2Client.setCredentials({refresh_token: credentials.refresh_token}); // Authorize a client with credentials

    // run the script
    return runScript(functionsOauth2Client,scriptId,JSON.stringify(googleTest)
    ).then((scriptData: any) => {
      console.log("Script data is" + JSON.stringify(scriptData));
      sendEmail(googleTest, scriptData);
      return JSON.stringify(scriptData);
    });
  } catch (err) {
    return JSON.stringify(err);
  }
});

function runScript(auth: any, scriptid: string, test: any) {
  return new Promise(function (resolve, reject) {
    script.scripts
      .run({auth: auth,scriptId: scriptid, resource: {function: "doGet", devMode: true,parameters: test }
      })
      .then((respons: any) => { resolve(respons.data);})
      .catch((error: any) => {reject(error);});
  });
}
在开发和生产中部署功能时,我已正确更改了服务帐户密钥和google凭据

我尝试过很多事情,包括:


该功能在开发firebase项目中运行良好,但在生产firebase项目中运行不理想。请帮忙

您需要检查您的功能是否已正确部署


不存在的函数(
404未找到
)或无法访问的函数(
403禁止
)都会给出该错误,因为Firebase函数从未执行过,这意味着永远不会将正确的CORS头发送回客户端。

我发现,当为函数设置未经验证的访问权限时,它可以完美地运行。如何确保httpsoncall函数可以通过身份验证运行?Pls helpFirebase函数必须保留为“公共”。
allAuthenticatedUsers
选项仅适用于登录的Google帐户(因为它们实际上是Google云功能),而不适用于Firebase身份验证帐户。您需要使用
context.auth
来拒绝对函数的访问。谢谢,我很担心是否可以访问诱惑者,但我现在已经实现了。它起作用了!谢谢,这有助于理解firebase返回的“internal”错误消息。