gpt4 book ai didi

amazon-web-services - 如何在 CDK + APIGateway + Lambda 中获取路径参数

转载 作者:行者123 更新时间:2023-12-05 01:27:25 27 4
gpt4 key购买 nike

所以,事实证明我一直都有它,但我错误地注销了它。我一直在做一个 Object.keys(event).forEach 和控制台记录每个键和值。我猜这没有显示值,因为它是一个嵌套对象。根据@robC3 的回答,使用 JSON.stringify 可以正确显示所有嵌套对象和值,而且也更容易! TL;DR 只需在您的网关路径中使用花括号,它们将出现在 event.pathParameters.whateverYouCalledThem

我习惯于表达你刚刚写的地方/stuff/:things在你的路线然后req.params.things在您的“东西”处理程序中变得可用。

我正在努力在 CDK 中获得相同的基本功能。我有一个名为“api”的 RestAPI 和类似的资源...

const api = new apigateway.RestApi(this, "image-cache-api", { //options })
const stuff = api.root.addResource("stuff")
const stuffWithId = get.addResource("{id}")
stuffWithId.addMethod("GET", new apigateway.LambdaIntegration(stuffLambda, options))

然后我部署函数并在 https://<api path>/stuff/1234 调用它

然后在我的 lambda 中检查 event.pathParameters就是这个:{id: undefined}

我已经查看了事件对象和我唯一能看到的地方 1234在路径 /stuff/1234 中虽然我可以从中解析出它,但我确信这不是它应该的工作方式。

:/

我在谷歌搜索时发现的大部分内容都提到了“映射模板”。对于这样一个常见的用例来说,这似乎过于复杂,所以我一直在努力假设会有某种默认映射。现在我开始认为没有。我真的必须指定一个映射模板才能访问路径参数吗?如果是这样,它应该放在我的 CDK 堆栈代码中的什么位置?

我尝试了以下...

stuffWithId.addMethod("GET", new apigateway.LambdaIntegration(stuffLambda, {
requestTemplate: {
"id": "$input.params('id')",
}
}))

但是得到了错误...

error TS2559: Type '{ requestTemplate: { id: string; }; }' has no properties in common with type 'LambdaIntegrationOptions'.

我很困惑我是否需要 requestTemplate、requestParametes 或其他完全不同的东西,因为到目前为止我找到的所有示例都是针对控制台而不是 CDK。

最佳答案

这工作正常,当您在浏览器中测试时,您可以看到完整路径、路径参数、查询参数等在事件结构中的位置。

//lambdas/handler.ts

// This code uses @types/aws-lambda for typescript convenience.
// Build first, and then deploy the .js handler.

import { APIGatewayProxyHandler, APIGatewayProxyResult } from 'aws-lambda';

export const main: APIGatewayProxyHandler = async (event, context, callback) => {
return <APIGatewayProxyResult> {
body: JSON.stringify([ event, context ], null, 4),
statusCode: 200,
};
}

//apig-lambda-proxy-demo-stack.ts

import * as path from 'path';
import { aws_apigateway, aws_lambda, Stack, StackProps } from 'aws-cdk-lib';
import { Construct } from 'constructs';

export class ApigLambdaProxyDemoStack extends Stack {
constructor(scope: Construct, id: string, props?: StackProps) {
super(scope, id, props);

const stuffLambda = new aws_lambda.Function(this, 'stuff-lambda', {
code: aws_lambda.Code.fromAsset(path.join('dist', 'lambdas')),
handler: 'handler.main',
runtime: aws_lambda.Runtime.NODEJS_14_X,
});

const api = new aws_apigateway.RestApi(this, 'image-cache-api');

const stuff = api.root.addResource('stuff');
const stuffWithId = stuff.addResource('{id}');
stuffWithId.addMethod('GET', new aws_apigateway.LambdaIntegration(stuffLambda));
}
}

这个示例查询:

https://[id].execute-api.[region].amazonaws.com/prod/stuff/1234?q1=foo&q2=bar

给出了这个回应(摘录):

Sample API Gateway test lambda response JSON

如果您想在 API 中的某个点处理任意路径,您将需要探索 IResource.addProxy() CDK 方法。例如,

api.root.addProxy({
defaultIntegration: new aws_apigateway.LambdaIntegration(stuffLambda),
});

在示例中的 API 根目录中创建了一个 {proxy+} 资源,并将所有请求转发给 lambda。您可以在同一个处理程序中处理所有端点,而不是在 API 网关中配置每个端点。

关于amazon-web-services - 如何在 CDK + APIGateway + Lambda 中获取路径参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69403579/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com