这个问题比我喜欢来这里的问题要简单一些,但是我一直在试图寻找答案,我绝对不能 -
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中,而无法指定路径的哪个部分对应于此处的名称。
我知道我总是可以用另一种方式传递它们,但这更干净,更符合我们想要使用的设置,所以我真的希望尽可能让它工作。有没有办法做到这一点,我完全没有或根本不支持?
答案 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>
请注意:
--entry-point
标志,否则应使用与CLI中使用的名称相同的名称导出您的函数。此名称将用于您生成的网址。--stage-bucket <STORAGE_BUCKET>
命令是可选的,但我一直使用它。index.js
或function.js
的文件以查找您的功能,但如果您提供的package.json
文件包含main
条目,则云功能会改为寻找它。答案 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);
答案 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)`);
}