15

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

谷歌云平台 HTTP 函数是否支持路由参数,如此处?http://expressjs.com/en/guide/routing.html#route-parameters

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

我知道我总是可以通过其他方式传递它们,但这更干净,更符合我们想要使用的设置,所以如果可能的话,我真的很想让它工作。有什么方法可以做到这一点,我完全错过了,还是根本不支持?

4

4 回答 4

12

我能够为此联系支持小组,看来是的,这是受支持的-您只需使用 req.path 即可提取完整路径,然后以某种方式对其进行解析(我使用了path-to -正则表达式

示例代码:

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为该命令的完整文档)。然后,您的新端点 URL 将是,然后您可以在实际进行调用(例如,调用)时将后续查询或路由参数附加到它。https://<YOUR_REGION>-<YOUR_PROJECT_ID>.cloudfunctions.net/myFunctiongethttps://<YOUR_REGION>-<YOUR_PROJECT_ID>.cloudfunctions.net/myFunction/paramA/paramB/not-a-param/paramC/also-not-a-param/paramD

请注意:

  1. --entry-point除非您使用该标志,否则您的函数应该以与 CLI 中使用的名称相同的名称导出。此名称将用于您生成的 URL。
  2. --stage-bucket <STORAGE_BUCKET>命令是可选的,但我一直使用它。
  3. Cloud Functions 将自动查找名为index.jsor的文件function.js来查找您的函数,但如果您提供package.json包含main条目的文件,则 Cloud Functions 将改为查找它。
  4. 我假设这将在某个时候离开 beta,此时您应该更新到新的命令工具。
于 2017-03-09T13:17:39.660 回答
2

首先创建一个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);

参考:它是如何在 firebase 文档中提到的

于 2020-07-05T17:58:04.343 回答
2

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

它是一个基于请求路径进行多项操作的路由器,还支持从路径中自动解析参数。

它将 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 函数的导出传递。

希望有帮助。

于 2017-10-01T12:32:51.303 回答
1

如果不想在正文中传递数据,可以随时将其放入 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)`);
  }
于 2018-10-28T12:49:16.517 回答