【问题标题】:Do Google Cloud Platform HTTP Functions Support Route Parameters?Google Cloud Platform HTTP 函数是否支持路由参数?
【发布时间】:2017-02-09 19:59:22
【问题描述】:

这个问题比我想来这里要简单一些,但我一直在逼自己寻找答案,但我绝对不能-

谷歌云平台 HTTP 函数是否支持路由参数,就像这里一样? http://expressjs.com/en/guide/routing.html#route-parameters

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

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

【问题讨论】:

    标签: google-cloud-platform google-cloud-functions


    【解决方案1】:

    我能够为此联系支持小组,看来是的,这是受支持的 - 你只需要使用 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,然后您可以在实际拨打电话时将后续查询或路由参数附加到它(例如,向 https://<YOUR_REGION>-<YOUR_PROJECT_ID>.cloudfunctions.net/myFunction/paramA/paramB/not-a-param/paramC/also-not-a-param/paramD 拨打 get 电话)。

    请注意:

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

    【讨论】:

    • 使用路由参数时cli部署过程是什么样的?
    • @gregm 哦,伙计,我最近刚刚在抱怨人们说“我修好了!”也没有提供示例代码......我显然是个伪君子,哈哈。添加了示例代码;希望这应该足够了。 LMK 如果您还有其他问题。至于斯蒂芬汉德利,我希望他能在某个时候得到他的问题的答案,但对于这里的其他任何人,如果我正确理解了这个问题,我不知道 CLI 部署与路由参数有任何变化。就像它没有一样对待它。
    • 我不清楚答案是如何在 cli 或控制台中部署该功能。于是我测试了一下:我部署了一个名为'helloworld'的HTTP触发函数,即url是/helloworld。然后将在嵌套在它下面的任何 url 上调用该函数。例如,'/helloworld/123/456/789.jpg` 将调用该函数。因此,在功能内,您可以设置内部快速路由。我希望 Google 文档更明确地说明这一点。
    • @jacob 啊,是的,Google 文档在我的经验中是一团糟。我继续编辑我的答案以获得一些额外的 CLI/控制台部署信息,我希望这会有所帮助。
    • 如果有人在 2020 年回归:您可以直接将您的 Express 应用程序导出为您的函数,所有正常的路由内容都可以正常工作。这是一个很好的博客:medium.com/google-cloud/…
    【解决方案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 函数的导出传递。

    希望对您有所帮助。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        如果你不想在body中传递数据,你可以随时将它放入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)`);
          }
        

        【讨论】:

        • 谢谢。对我帮助很大
        猜你喜欢
        • 1970-01-01
        • 2023-04-10
        • 2016-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-17
        • 2017-10-24
        • 1970-01-01
        相关资源
        最近更新 更多