首页 > 解决方案 > AngularFireFunction 直接调用云函数

问题描述

我有一个 Angular 网站,我正在尝试将云功能集成为 Expressjs。只有云功能可以正常工作。当我访问 http://localhost:5001/project_id/us-central1/app 时,我可以看到控制台输出。但是对于角度来说,它不起作用。

这是尝试使用角度时的输出:

hosting: 127.0.0.1 - - [16/Nov/2020:18:57:01 +0000] "GET /favicon.ico HTTP/1.1" 200 4286 "http://localhost:5000/payment" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"

函数/index.js:

const functions = require('firebase-functions');
const admin = require('firebase-admin');

admin.initializeApp(functions.config().firebase);

const express = require('express');
const app = express();

app.get('/', (req, res) => {
    console.log("Hello");
});
exports.app = functions.https.onRequest(app);

app.module.ts:

...
providers: [UserService, AngularFireAuthGuard,
    { provide: ORIGIN,useValue: 'http://localhost:5001' },
    { provide: REGION, useValue: 'us-central1' }],
...

firebase.json:

{
  "hosting": {
    "public": "dist/user",
    "ignore": [
      "firebase.json",
      "**/node_modules/**"
    ],
    "rewrites": [
      {
        "source": "**",
        "function": "app",
        "destination": "/index.html"
      }
    ]
  },
  "firestore": {
    "rules": "firestore.rules",
    "indexes": "firestore.indexes.json"
  },
  "functions": {
    "source": "functions"
  }
}

payment.component.ts (我试图调用云函数):

constructor(private _fb: FormBuilder, private router: Router, private fns: AngularFireFunctions) {
    const callable = fns.httpsCallable('app');
    var data = callable({ name: 'some-data' });
    data.subscribe(async res => {
      console.log(res);
      });
  }

标签: angularfirebasegoogle-cloud-functions

解决方案


您的客户端应用程序正在尝试调用可调用函数,但您的实际函数是由 express 应用程序支持的 HTTP 函数。这种组合是行不通的。如果要使用可调用函数,则必须遵循可调用函数文档中的说明并声明一个onCall函数,而不是onRequest. onRequest用于正常的 HTTP 调用。从该文档中,请注意:

请务必记住,HTTPS 可调用函数与 HTTP 函数相似但不完全相同。要使用 HTTPS 可调用函数,您必须使用适用于您平台的客户端 SDK 以及 functions.https 后端 API(或实现协议)。可调用对象与 HTTP 函数有以下主要区别:

或者,如果您确实想在后端使用 express 应用,您将无法使用 Firebase Functions 客户端 SDK 调用它。为此,请使用普通的 HTTP 客户端库。


推荐阅读