正确的请求模板映射或处理,以便使用无服务器框架将照片上传到 s3

Proper request template mapping or process in order to upload a photo to s3 using Serverless Framework

我正在使用无服务器版本 1.0.0 和节点版本 5.7.1

我有一个端点用于更新 mysql 数据库中 table 的照片。因此,在插入上述照片之前,我将从浏览器获取的表单数据上传到 s3,然后使用 return 图像 url 更新照片 url。

问题是我不知道在 serverless.yml 中定义请求映射模板的正确方法是什么,这样我就可以提取照片、路径参数和 $主体 id

的上下文变量

这是我当前的 serverless.yml 函数定义

updateBoardPhoto:
  handler: handler.updateBoardPhoto
  events:
    - http:
       path: boards/{boardId}/photo
       method: PUT
       integration: lambda
       parameters:
         headers:
           Authorization: false
         body:
           photo: true
         paths:
           boardId: true
       request:
         passThrough: WHEN_NO_TEMPLATES
         template:
           multipart/form-data: '{"principalId" : "$context.authorizer.principalId", "body" : $input.json("$"), "boardId": "$input.params(''boardId'')"'

现在这是我的处理程序:

function updateBoardPhoto(event, context, callback) {
var photo = event.body.photo;
var boardId = event.boardId;
var principal = utils.processPrincipalId(event.principalId);

var s3FileName = randomstring.generate(10) + ".jpg";
var s3 = new AWS.S3();
s3.putObject({
    Bucket: config.UPLOAD_BUCKET,
    Key: s3FileName,
    Body: photo,
    ACL: 'public-read',
}, function (err, data) {
    if (err) {
        throw err;
    } else {
        console.log(data);
        context.succeed(data);
    }
});

尝试 1

我尝试使用 WHEN_NO_TEMPLATES 直通选项,但没有定义模板,但我只得到 photo 缓冲区输入变量,没有 boardId。但是我成功地将照片上传到 s3。

request:
  passThrough: WHEN_NO_TEMPLATES

// event variable i get:
{ photo: <Buffer 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 02 1c 00 00 00 ac 08 06 00 00 00 30 ab 75 20 00 00 00 19 74 45 58 74 53 6f 66 74 77 61 72 65 00 ... >,

isOffline: true, 阶段变量:{} }

尝试 2

使用 ff 请求定义:

request:
  passThrough: WHEN_NO_MATCH
  template:
    multipart/form-data: '{"principalId" : "$context.authorizer.principalId", "body" : $input.json("$"), "boardId": "$input.params(''boardId'')"'

// event variable i get
{ isOffline: true, stageVariables: {} }

我在我的事件变量中根本看不到任何变量!没有照片,也没有 boardId。

谁能告诉我我做错了什么?我正在使用邮递员进行测试。

我认为您以 JSON 格式传递图像,因此您可以使用 $input.body 访问模板中的整个正文。此外,您应该在参数名称周围放置单引号而不是双单引号。

喜欢, multipart/form-data: '{"principalId" : "$context.authorizer.principalId", "body" : "$input.body", "boardId": "$input.params('boardId')"'


仅供参考:

API 网关目前不支持二进制数据。我建议您将图像的 base64 编码字符串发送到 API 网关,然后在将 base64 编码放入 Lambda 函数中的 S3 之前进行解码。