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
调用]).
请注意:
- 除非您使用
--entry-point
标志,否则您的函数应该以与 CLI 中使用的名称相同的名称导出。此名称将用于您的结果 URL.
--stage-bucket <STORAGE_BUCKET>
命令是可选的,但我一直使用它。
- Cloud Functions 将自动查找名为
index.js
或 function.js
的文件来查找您的函数,但如果您提供包含 main
条目的 package.json
文件,然后 Cloud Functions 将查找它。
- 我认为,这将在某个时候离开测试版,此时您应该更新到新的命令工具。
你可以试试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);
这个问题比我想来这里提出的问题要简单一些,但我一直在努力寻找答案,但我绝对做不到-
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
调用]).
请注意:
- 除非您使用
--entry-point
标志,否则您的函数应该以与 CLI 中使用的名称相同的名称导出。此名称将用于您的结果 URL. --stage-bucket <STORAGE_BUCKET>
命令是可选的,但我一直使用它。- Cloud Functions 将自动查找名为
index.js
或function.js
的文件来查找您的函数,但如果您提供包含main
条目的package.json
文件,然后 Cloud Functions 将查找它。 - 我认为,这将在某个时候离开测试版,此时您应该更新到新的命令工具。
你可以试试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);