我正在遵循Google的tutorial,在我的Cloud Function前面设置 Google Cloud端点(不是AWS API Gateway)。我正在触发我的Cloud Function来触发一个AWS Lambda函数,并且我试图从OpenAPI spec定义的端点传递一个path parameter
。
路径参数是URL路径的可变部分。它们通常用于指向集合中的特定资源,例如ID标识的用户。 URL可以具有多个路径参数,每个路径参数都用大括号{}表示。
paths: /users/{id}: get: parameters: - in: path name: id # Note the name is the same as in the path required: true schema: type: integer
GET /users/{id}
我的openapi.yaml
swagger: '2.0'
info:
title: Cloud Endpoints + GCF
description: Sample API on Cloud Endpoints with a Google Cloud Functions backend
version: 1.0.0
host: HOST
x-google-endpoints:
- name: "HOST"
allowCors: "true
schemes:
- https
produces:
- application/json
paths:
/function1/{pathParameters}:
get:
operationId: function1
parameters:
- in: path
name: pathParameters
required: true
type: string
x-google-backend:
address: https://REGION-FUNCTIONS_PROJECT_ID.cloudfunctions.net/function1
responses:
'200':
description: A successful response
schema:
type: string
当我使用端点URL https://REGION-FUNCTIONS_PROJECT_ID.cloudfunctions.net/function1/conversations
时遇到的错误是我的AWS lambda函数的TypeError
StatusCode:200, FunctionError: "Unhandled", ExecutedVersion: "$LATEST". Payload: "errorType":"TypeError", errorMessage:"Cannot read property 'startsWith' of undefined..."
是说在线
var path = event.pathParameters;
...
...
if (path.startsWith('conversations/'){...};
我的path
变量未定义。
最初,我认为我的Google Function无法正确传递pathParameters
,但是当我使用触发事件{"pathParameters":"conversations"}
测试我的Google函数时,我的Lambda成功返回了有效载荷。
我的Google Cloud功能:
let AWS = require('aws-sdk');
AWS.config.update({
accessKeyId: 'key',
secretAccessKey: 'secret',
region: 'region'
})
let lambda = new AWS.Lambda();
exports.helloWorld = async(req,res) => {
let params = {
FunctionName:'lambdafunction',
InvocationType: "RequestRespone",
Payload: JSON.stringify(req.body)
};
res.status(200).send(await lambda.invoke(params, function(err,data){
if(err){throw err}
else{
return data.Payload
}
}).promise());
}
编辑1:
看到这个Google网上论坛post,我尝试将其添加到openapi.yaml
文件path_translation: APPEND_PATH_TO_ADDRESS
中,但是我仍然没有运气。
...
paths:
/{pathParameters}:
get:
...
x-google-backend:
address: https://tomy.cloudfunctions.net/function-Name
path_translation: APPEND_PATH_TO_ADDRESS
@Arunmainthan Kamalanathan在评论中提到,直接在具有触发事件{"pathParameters":"conversations"}
的AWS和Google Cloud中进行测试并不等同于将req.body
从我的Google函数传递到AWS lambda。我认为这是发生错误的地方-我没有在有效负载中正确传递path参数。
编辑2:
此Stackoverflow post涉及使用req.path
将路由参数传递给Cloud Functions。当我console.log(req.path)
得到/
和console.log(req.params)
我得到{'0': '' }
时,由于某种原因,我的path参数没有正确地从Cloud Endpoint URL传递到我的Google函数。 / p>
答案 0 :(得分:3)
在我的openapi.yaml中指定多个路径/路由时,我遇到了同样的问题。这完全取决于您放置x-google-backend的位置(顶级与操作级)。这对path_translation的行为有影响。您也可以自己覆盖path_translation,如documentation清楚描述的那样:
path_translation:[APPEND_PATH_TO_ADDRESS | CONSTANT_ADDRESS]
可选。设置ESP在制作时使用的路径转换策略 目标后端请求。
注意:在OpenAPI的顶层使用x-google-backend时 规范,path_translation默认为APPEND_PATH_TO_ADDRESS, 并且在操作级别使用x-google-backend 在OpenAPI规范中,path_translation默认为CONSTANT_ADDRESS。 有关路径翻译的更多详细信息,请参见了解 路径翻译部分。
示例1:您是否具有一个具有多个路径的云功能?将x-google-backend放在顶层。
示例2:您是否具有对应于不同路径的多个云功能?将x-google-backend放在操作级别,以便您可以配置不同的目标。
答案 1 :(得分:0)
当调用类型为RequestRespone
时,可以直接从lambda的event
参数访问有效负载。
查看Google函数的“有效负载”参数:
let params = {
FunctionName:'lambdafunction',
InvocationType: "RequestRespone",
Payload: JSON.stringify({ name: 'Arun'})
};
res.status(200).send(await lambda.invoke(params)...)
还有Lambda部分:
exports.handler = function(event, context) {
context.succeed('Hello ' + event.name);
};
我希望这会有所帮助。