Google Cloud Platform HTTP功能是否支持路由参数?

时间:2017-02-09 19:59:22

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

这个问题比我喜欢来这里的问题要简单一些,但是我一直在试图寻找答案,我绝对不能 -

Google Cloud Platform HTTP功能是否支持路由参数,如此处所示? http://expressjs.com/en/guide/routing.html#route-parameters

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

我知道我总是可以用另一种方式传递它们,但这更干净,更符合我们想要使用的设置,所以我真的希望尽可能让它工作。有没有办法做到这一点,我完全没有或根本不支持?

4 个答案:

答案 0 :(得分:8)

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

请注意:

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

您可以尝试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 :(得分:0)

如果您不想在正文中传递数据,则始终可以将其放入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)`);
  }