Google云平台HTTP函数支持路由参数吗?

Do Google Cloud Platform HTTP Functions Support Route Parameters?

这个问题比我想来这里提出的问题要简单一些,但我一直在努力寻找答案,但我绝对做不到-

Google Cloud Platform HTTP 函数支持路由参数吗? http://expressjs.com/en/guide/routing.html#route-parameters

具体来说,我看到 Google Cloud Platform HTTP 函数似乎使用 Express 作为基础,但我看到所有函数的任何示例都已经 运行 关闭 req 和 res 参数而没有别的。我可以访问主体内的数据,但这不允许我从路由中提取参数,例如在传递给“/users/:userId/books/:bookId”的请求中查找图书 ID。如果无法指定路径的哪一部分对应于此处的哪个名称,我看不出如何将它们填充到 req.params 中。

我知道我总是可以用另一种方式传递它们,但这种方式更简洁,更符合我们想要使用的设置,所以如果可能的话,我真的很想让它工作。有没有什么方法可以做到这一点我完全不知道或者根本不支持?

我能够为此联系支持小组,看起来是的,这是受支持的——你只需要使用 req.path 来提取完整​​路径,然后在一些中解析它方式(我用的是path-to-regexp

示例代码:

exports.myFunction = function(req, res) {
    var keys = [];
    var re = pathToRegexp('/:paramA/:paramB/not-a-param/:paramC/also-not-a-param/:paramD?', keys, {strict: false});
    var pathVars = re.exec(req.path);
    if (pathVars) {
        console.log(JSON.stringify(pathVars));
        var paramA = pathVars[1];
        var paramB = pathVars[2];
        var paramC = pathVars[3];
        var paramD = pathVars[4];
        // Do stuff with the rest of your functionality here
        res.status(200).send('Whatever you wanna send');
    }
}

部署它的命令行代码看起来像 gcloud beta functions deploy myFunction --stage-bucket<STORAGE_BUCKET> --trigger-http(此命令的完整文档 here)。您的新端点 URL 将成为 https://<YOUR_REGION>-<YOUR_PROJECT_ID>.cloudfunctions.net/myFunction,然后您可以在实际进行调用时向其附加后续查询或路由参数(例如,对 [=14= 进行 get 调用]).

请注意:

  1. 除非您使用 --entry-point 标志,否则您的函数应该以与 CLI 中使用的名称相同的名称导出。此名称将用于您的结果 URL.
  2. --stage-bucket <STORAGE_BUCKET>命令是可选的,但我一直使用它。
  3. Cloud Functions 将自动查找名为 index.jsfunction.js 的文件来查找您的函数,但如果您提供包含 main 条目的 package.json 文件,然后 Cloud Functions 将查找它。
  4. 我认为,这将在某个时候离开测试版,此时您应该更新到新的命令工具。

你可以试试modofun:https://modofun.js.org

这是一个基于请求路径进行多次操作的router,也支持从路径自动解析参数

它将 URL 路径解析为操作名称和填充到 req.params 中的参数列表,与使用正则表达式时的 Express 相同。所以你可以这样做:

var modofun = require('modofun')

exports.bookstore = modofun(
  {
    /**
     * /users/:userId/:bookId
     */
    users: (req, res) => {
      var [userId, bookId] = req.params
      // ...
      res.json(data)
    }
  },
  { mode: 'reqres' }
)

或者,您也可以将参数扩展为函数参数并使用纯函数,如下所示:

var modofun = require('modofun')

exports.bookstore = modofun(
  {
    /**
     * /users/:userId/:bookId
     */
    users: (userId, bookId) => {
      // ...
      return data
    }
  },
  { mode: 'function' }
)

我为生产环境中的 Google Cloud Functions 部署创建了它,主要是因为我不需要来自 Express 的大量依赖项,而且我想要更轻量级的东西。

但请记住,您也可以将 Express 与 Google Cloud Functions 一起使用。没有什么能阻止您使用通常的路由匹配规则创建一个 Express 应用程序,然后将其作为导出传递给您的 GCloud 函数。

希望对您有所帮助。

如果您不想在正文中传递数据,您可以随时将其放入 url 的查询参数中。 喜欢:

http://yourGoogleProject.cloudfunctions.net/users?userid={userId}&bookId={bookid}

在云函数中,您只需从 req 对象访问查询参数,例如:

exports.users = (req, res) => {
  res.status(200).send(`Hello from user:  + $(req.query.userid) your bookId: $(req.query.bookid)`);
  }

首先创建一个Handler函数,

function bookIdHandler(req,res){
    let bookId= req.params.bookId;

    //your code goes here
}

您可以只将一个 Express App 对象传递给云函数路由

const express = require('express');

const app = express();

app.get('users/:userId/:bookId', bookIdHandler);
//++ any other express endpoints


// Expose Express API as a single Cloud Function:
exports.widgets = functions.https.onRequest(app);

参考:How its mentioned in firebase docs