如何将 Cloud Function 的自定义域用作 POST 请求

Xaz*_*zzo 5 javascript node.js express firebase google-cloud-functions

我对 Node.js 的经验不是很丰富,但是快速学习对 javaScript 都很好。我正在使用 Cloud Functions 为项目创建 API,并尝试使用自定义域来访问此 API。在我的 Firebase 托管上,我连接了一个子域“api.mydomain.com”。

我使用 express 在我的函数 index.js 上有一个名为“api”的函数:

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

app.post('/endpoint/:userId', (req, res) => {

  ... EXECUTE CODE 

  res.json(json);  

});

exports.api = functions.https.onRequest(app);
Run Code Online (Sandbox Code Playgroud)

在我的 firebase.json 中,我进行了重写:

    "rewrites": [
  {
    "source": "/api/**",
    "function": "api"
  }
Run Code Online (Sandbox Code Playgroud)

所以理论上,如果我向https://api.mydomain/api/endpoint/userID发出 POST 请求应该执行该函数,但我得到:

无法 POST /api/endpoint/userID/

如果我使用默认的 firebase URL 访问像https://us-central1-my-proyect.cloudfunctions.net/api这样的函数,它工作正常。

您知道如何正确配置自定义域以使用我的功能吗?

非常感谢您的帮助!

Dou*_*son 4

当您使用 Express 应用程序作为 HTTPS 函数的目标时,该函数的名称会添加到托管 URL 的路径前面,就像您调用函数方向时一样。有两种方法可以弥补这一点:

  1. 将前缀路径放入您的路由路径中:

    app.post('/api/endpoint/:userId', (req, res) => { ... })
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建第二个 Express 应用程序,用于路由 /api 下的所有内容,并将其发送到 Cloud Functions:

    app.post('/endpoint/:userId', (req, res) => { ... })
    const app2 = express()
    app2.use('/api', app)
    exports.api = functions.https.onRequest(app2)
    
    Run Code Online (Sandbox Code Playgroud)

无论哪种方式,当您重写/api/**function 的路径时api,您的函数都会被调用。