Безсерверная функция AWS не отвечает с изображением - PullRequest
0 голосов
/ 23 февраля 2019

Я пытаюсь, чтобы AWS API Gateway отвечал с изображением.Мой бессерверный лямбда-код имеет следующий вид:

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

1 Ответ

0 голосов
/ 23 февраля 2019

Работа с двоичными файлами в API Gateway - это всегда сложная задача.Однако мне удалось заставить его работать.

Все, что вам нужно сделать, это сообщить API-шлюзу, что ваш ответ закодирован в 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 на нем, чтобы сделать код немного проще.

Надеюсь, это поможет!

РЕДАКТИРОВАТЬ :

Я былвсе еще пытаясь заставить его работать с Express, поэтому я нашел это: https://github.com/awslabs/aws-serverless-express/issues/99#issuecomment-332169739

Я должен признать, что я не тестировал, но это может сработать, если вам действительно нужно, чтобы Express обрабатывал маршруты для вас.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...