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



我使用的是无服务器版本1.0.0和Node版本5.7.1

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

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

的$context变量。

这是我当前的无服务器。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:没错,stagvariables: {}}

尝试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: {} }

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

谁能告诉我我做错了什么?我正在用邮差测试。

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

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


供参考:

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

相关内容

  • 没有找到相关文章

最新更新