AWS无服务器功能未响应映像

时间:2019-02-23 10:21:37

标签: node.js amazon-web-services serverless-framework aws-serverless

我正在尝试让AWS API Gateway用图像进行响应。我的无服务器Lambda代码如下

const express = require('express');
const serverless = require('serverless-http');
const bodyParser = require('body-parser');
const request = require('request');
const fetch = require('node-fetch')
var Jimp = require('jimp');
const app = express()
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: true }))

app.get('/image/:id', async(req, res) => {
    const id = req.params.id;

    var imgUrl = 'https://developer.salesforce.com/forums/profilephoto/729F00000005O41/T';
    let options = {};

    const image = await Jimp.read(imgUrl);
    image.getBuffer(Jimp.MIME_JPEG, (err, buffer) => {
        res.set('content-type', 'image/jpeg');
        res.send(buffer.toString('base64'));
    });
});
// wrap express app instance with serverless http function
module.exports.handler = serverless(app)

serverless.yml


provider:
  name: aws
  runtime: nodejs8.10
  stage: dev
  region: us-east-1
  memorySize: 512

custom:
  apigwBinary:
    types:           #list of mime-types
      - 'image/jpg'
      - 'image/jpeg'
      - 'image/png'
functions:
  avatarFunc:
    handler: index.handler
    events:
      - http:
          path: image/{id}
          method: get
          contentHandling: CONVERT_TO_BINARY

plugins:
  - serverless-offline
  - serverless-apigw-binary

返回的图像是一个黑框。 enter image description here

2 个答案:

答案 0 :(得分:1)

在API Gateway中处理二进制文件总是很麻烦。不过,我设法使它起作用。

您需要做的就是告诉API Gateway您的响应是使用base64编码的。

这是一个可行的解决方案:

module.exports.hello = async (event, context) => {
  const imgUrl = 'https://developer.salesforce.com/forums/profilephoto/729F00000005O41/T';
  const image = await jimp.read(imgUrl);
  const buffer = await image.getBufferAsync(jimp.MIME_JPEG);
  return {
    statusCode: 200,
    headers: {
      'content-type': 'image/jpeg'
    },
    body: buffer.toString('base64'),
    isBase64Encoded: true
  };

};

但是,我在这里看到的真正问题是Express正在为您管理路由,因此我认为您无法拦截API GW的响应以添加字段“ isBase64Encoded”,因此,我很担心您必须让此API由API网关而不是Express来管理,以使其正常工作。

此外,Jimp提供了一种getBufferAsync方法,该方法返回一个诺言,因此您只需在其上await即可使代码更简单。

希望有帮助!

EDIT

我仍在尝试使其与Express一起使用,因此我发现了这一点:https://github.com/awslabs/aws-serverless-express/issues/99#issuecomment-332169739

我必须承认我没有进行测试,但是如果您确实需要Express来为您处理路线,这可能会起作用。

enter image description here

答案 1 :(得分:0)

好。我刚刚经历了此事,以为我会分享解决方案。该问题与无服务器和AWS之间的不匹配有关。因此,我们将它们放在同一页面上。

FIRST->无服务器配置

const binaryMimeTypes = {binary: [
  'image/*',
  'image/jpeg',
  'image/png',
  'image/svg+xml',
]};

module.exports.server = sls(app, binaryMimeTypes) 

这会将无服务器配置为将关联的Mime类型服务器作为Base64。

SECOND-> AWS Config

在AWS API中,选择网关,然后选择设置。向下滚动并添加以下二进制类型:

AWS Config

就是这样!现在应该可以了!