如何使用 Typescript 的 CDK 配置发送(apigateway)和获取(lambda)请求查询参数

Sto*_*iev 4 typescript aws-cdk

我已经cdk init注册了一个应用程序。我的应用程序有一个 ApiGateway 堆栈,其中“GET”方法绑定到根 (\'/\')。Lambda 函数绑定到“GET”方法。我希望当我发送带有查询参数的“GET”请求时,例如?param1=uno&param2=dos\n在 myHandler 中使用类似的内容访问它们

\n\n
!pseudo-code alert! \nconst queryParams = event.queryParams\n
Run Code Online (Sandbox Code Playgroud)\n\n

堆栈配置在lib/my-app-stack.ts

\n\n
import cdk = require("@aws-cdk/core");\nimport lambda = require("@aws-cdk/aws-lambda");\nimport apigateway = require("@aws-cdk/aws-apigateway");\nimport path = require("path");\n\nexport class ApiIntegrationStack extends cdk.Stack {\n  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {\n    super(scope, id, props);\n\n    // Handlers\n    const my_handler = new lambda.Function(this, "myHandler", {\n      code: lambda.Code.asset(path.join(__dirname, "../src")),\n      handler: "handler.myHandler",\n      runtime: lambda.Runtime.NODEJS_8_10,\n      memorySize: 1024\n    });\n    const my_integration = new apigateway.LambdaIntegration(\n      my_handler\n    );\n\n    const default_handler = new lambda.Function(this, "defaultHandler", {\n      code: lambda.Code.asset(path.join(__dirname, "../src")),\n      handler: "handler.defaultHandler",\n      runtime: lambda.Runtime.NODEJS_8_10,\n      memorySize: 1024\n    });\n\n    // API Gateway set-up\n    const my_api = new apigateway.LambdaRestApi(this, "myApi", {\n      handler: default_handler,\n      proxy: false\n    });\n\n    // Routing\n    my_api.root.addMethod("GET", my_integration); /*, {\n      requestParameters: {\n        \'page_tag\': true,\n        \'language\': true\n      }\n    });\n    */\n  }\n}\n\n
Run Code Online (Sandbox Code Playgroud)\n\n

处理程序配置在src/handler.ts

\n\n
"use strict";\nimport { Handler, Context, Callback } from "aws-lambda";\n\nconst myHandler: Handler = (\n  event: any,\n  context: Context,\n  callback: Callback\n) => {\n\n  const queryParams = []; // ??\n  const response = {\n    statusCode: 200,\n    headers: {\n      "Access-Control-Allow-Origin": "*" // Required for CORS support to work\n    },\n    body: JSON.stringify({\n      message: "Ahoy, My handler here!"\n    })\n  };\n\n  callback(null, response);\n};\n\nconst defaultHandler: Handler = (\n  event: any,\n  context: Context,\n  callback: Callback\n) => {\n  const response = {\n    statusCode: 200,\n    headers: {\n      "Access-Control-Allow-Origin": "*" // Required for CORS support to work\n    },\n    body: JSON.stringify({\n      message: "Ahoy, Default handler here!"\n    })\n  };\n\n  callback(null, response);\n};\n\nexport { myHandler, defaultHandler };\n\n
Run Code Online (Sandbox Code Playgroud)\n\n

我发现与这个问题相关的问题:

\n\n

requestParameters 返回 \xe2\x80\x9c 指定的映射表达式无效: true\xe2\x80\x9d\n

\n\n

传递 aws lambda 函数的查询参数\n

\n\n

感谢您的关注!

\n

Jon*_*son 7

不知何故,通过(浏览)文档,我也没有完全清楚这一点;我认为这需要 api 网关本身的一些上下文知识。

需要.addMethod3个参数,其中之一是requestParameters你声明你有方法请求参数的地方,即

requestParameters: {
   "method.request.querystring.page_tag": true,
   "method.request.querystring.language": true,
}
Run Code Online (Sandbox Code Playgroud)

然后,在集成本身中,提供一个requestParameters值,将集成请求的查询字符串参数映射到您设置的方法请求参数,即

     requestParameters: {
          "integration.request.querystring.page_tag":
          "method.request.querystring.page_tag", 
          "integration.request.querystring.language":
          "method.request.querystring.language",
        },
...
Run Code Online (Sandbox Code Playgroud)