response主体是一个字符串
响应中的状态代码,正文,响应标头使用回调模式返回我的响应(请参见上文)
serverless.yml
MyYML:
service: myService
provider:
name: aws
runtime: nodejs12.x
iamRoleStatements:
- Effect: "Allow"
Action:
- "s3:GetObject"
- "s3:PutObject"
Resource: "arn:aws:s3:::myS3Bucket/*"
functions:
saveToS3:
handler: handler.saveToS3
events:
- http:
path: users
method: post
cors: true
plugins:
- serverless-offline
resources:
Resources:
NewResource:
Type: AWS::S3::Bucket
Properties:
BucketName: myS3Bucket
发现问题,面对面,因为我花了几个小时才找到它。我有两个问题:
链接:-https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-gateway-simple-proxy-for-lambda-for-lambda-for-lambda-for-lambda-for-lambda-act-format
{
"isBase64Encoded": true|false,
"statusCode": httpStatusCode,
"headers": { "headerName": "headerValue", ... },
"multiValueHeaders": { "headerName": ["headerValue", "headerValue2", ...], ... },
"body": "..."
}
catch(e => callback(null, { statusCode: 500, body: JSON.stringify(e) }));
错误可以在此处设置标题吗? 如果不是,则可能是语法错误。
在我们的情况下,我们正在使用无服务器 + API网关 + lambda。我们的主要app.ts
导出一个由无服务器包裹的异步处理程序。例如(EnvironmentService
只是环境配置的服务层):
const allowedBinaryMimeTypes = EnvironmentService.getFileMimeTypesAllowed();
...
const handler = serverless(app, { binary: allowedBinaryMimeTypes });
在修改任何代码之前,502不良网关错误日志正在显示此(AWS CloudWatch):
我们的解决方案是覆盖默认的AWS提供商超时。
static async getObject(type: string, pathParams: APIGatewayProxyEventPathParameters): Promise<any> {
const params = await this.setRequestParams(type, pathParams.id, pathParams.fileName);
try {
// get S3 object/file
const data = await S3.getObject(params).promise();
// some bug with AWS converting JPG objects to JPEGg
const contentType = data.ContentType === 'image/jpeg' ? 'image/jpg' : data.ContentType;
return {
statusCode: 200,
headers: {
'Access-Control-Allow-Headers': 'Content-Type',
'Access-Control-Allow-Origin': '*', // Required for CORS support to work
'Access-Control-Allow-Methods': 'OPTIONS,GET',
'Content-Type': contentType
},
body: data.Body.toString('base64'),
isBase64Encoded: true
};
} catch (err) {
console.error(err);
throw err;
}
}
我使用CDK。在我的情况下,我添加了参数binaryMediaTypes: ["application/json"]
binaryMediaTypes
当您创建将用作特定服务(例如AWS
)的API时,您将非常有用。
从API定义中解散,它像魅力一样工作