我正在尝试使用 AWS CDK 对 AWS API 网关的 GET 请求执行请求验证,特别是查询参数验证:
const api = apigw.RestApi.fromRestApiAttributes(this, props.attributes.apiGatewayName, {
restApiId: cdk.Fn.importValue('th-api-id'),
rootResourceId: cdk.Fn.importValue('th-api-resource-id'),
});
api.root
.resourceForPath("/trackCartons")
.addMethod("GET", new apigw.LambdaIntegration(trackCartonsHandler), {
requestParameters: {
'method.request.querystring.cartonID': true
},
requestValidatorOptions: {
validateRequestParameters: true,
},
});
上面的代码给出了错误:
TypeError: this.api.addRequestValidator is not a function
at Method.requestValidatorId (C:\Users\Sushant Sinha\Desktop\aws\carton-delivery\node_modules\aws-cdk-lib\aws-apigateway\lib\method.js:1:5827)
at new Method (C:\Users\Sushant Sinha\Desktop\aws\carton-delivery\node_modules\aws-cdk-lib\aws-apigateway\lib\method.js:1:2701)
at Resource.addMethod (C:\Users\Sushant Sinha\Desktop\aws\carton-delivery\node_modules\aws-cdk-lib\aws-apigateway\lib\resource.js:1:1188)
at new CartonDeliveryStack (C:\Users\Sushant Sinha\Desktop\aws\carton-delivery\lib\carton-delivery-stack.js:95:8)
at Object.<anonymous> (C:\Users\Sushant Sinha\Desktop\aws\carton-delivery\bin\carton-delivery.js:28:1)
at Module._compile (node:internal/modules/cjs/loader:1256:14)
at Module._extensions..js (node:internal/modules/cjs/loader:1310:10)
at Module.load (node:internal/modules/cjs/loader:1119:32)
at Module._load (node:internal/modules/cjs/loader:960:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
Node.js v18.16.1
它还会转储路径的代码
C:\Users\Sushant Sinha\Desktop\aws\carton-delivery\node_modules\aws-cdk-lib\aws-apigateway\lib\method.js:1
到控制台。
没有验证器,API 可以完美运行。我已经将“resourceForPath”更改为“addResource”方法,但除此之外,整个代码似乎与互联网上的代码相同。
RestApi.fromRestApiAttributes
方法返回类型 IRestApi
。
IRestApi
接口未定义addRequestValidator
方法 - 这可能是问题的根源,因为Method
的CDK实现似乎正在尝试使用addRequestValidator
方法。
我建议如果可能的话重构您的代码,这样您就可以通过 props 传递对
RestApi
构造的引用,而不是从导入的属性实例化 RestApi
。这确实假设您的 API 也在同一包的 CDK 中定义,但从问题中尚不清楚。您的新代码可能如下所示:
interface TrackCartonsApiProps {
readonly api: RestApi
}
class TrackCartonsApi extends Construct {
constructor(scope: Construct, id: string, props: TrackCartonsApiProps) {
props.api.root
.resourceForPath("/trackCartons")
.addMethod("GET", new apigw.LambdaIntegration(trackCartonsHandler), {
requestParameters: {
'method.request.querystring.cartonID': true
},
requestValidatorOptions: {
validateRequestParameters: true,
},
});
}
}
来自定义根 api 的构造或堆栈:
const api = ...
const trackCartonsApi = new TrackCartonsApi(this, 'TrackCartonsApi', {
api: api
});
我知道这个问题很老了,但我还没有在网上找到解决方案,所以我查看了代码并找到了一个。
所以基本上您仍然可以使用 IRestApi 并通过实例化 RequestValidator 并将其作为方法选项传递给您的方法来添加 requestValidator。
const restApi = RestApi.fromRestApiAttributes(this, 'APIGW', {
restApiId: config['rest-api-id'],
restApiName: config['rest-api-name'],
rootResourceId: config['rest-api-root-id']
});
...
const requestValidator = new RequestValidator(this, 'id', {
restApi: restApi,
validateRequestBody: true
})
const reource = typeResource.addResource('test');
dataReource.addMethod('PUT', new LambdaIntegration(testLambda, {
proxy: true
}), {
requestValidator: requestValidator
});