Ошибка обработки двоичных файлов с помощью экспресс-приложения, развернутого в AWS lambda - PullRequest
0 голосов
/ 21 мая 2019

Я портирую старое существующее приложение Express на AWS Lambda. Приложение содержит только 1 конечную точку, и операция действительно проста:

  1. Получает файл docx через запрос POST
  2. Манипулирует содержимым файла
  3. Отправляет измененную копию файла docx отправителю.

Вот и все. Работает как отдельное приложение в VPS. Но он терпит неудачу при развертывании на лямбда-AWS, используя без сервера. Полученный файл поврежден.

Это упрощенная версия файла app.js

var express = require('serverless-express/express');
var formidable = require('formidable');
var fs = require('fs');
var JSZip = require('JSZip');
var Docxtemplater = require('docxtemplater');
var handler = require('serverless-express/handler');

// Instance express
var app = express();

app.post('/', function (req, res, next) {

    var form = new formidable.IncomingForm();

    // Callback to answer inconming POST request
    form.parse(req, function (err, fields, files) {
        // File sent
        uploaded_path = files.file.path;

        fs.readFile(uploaded_path, function (err, data) {

           // Create zip file with the data. It fails here in AWS Lambda!
           var zip = new JSZip(data);

           // Pass the zip file to Docxtemplater to do stuff...
           var doc = new Docxtemplater();
           doc.loadZip(zip);

           // More stuff here... whatever
        }
    }
}

module.exports.handler = handler(app);

А вот файл serverless.yml

service: myservice

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

custom:
  apigwBinary:
    types:
      - 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'

provider:
  name: aws
  runtime: nodejs8.10
  stage: dev
  region: eu-west-3
  role: myrole
functions:
  app:
    handler: app.handler
    events:
      - http: GET /
      - http: POST /
      - http: 'ANY {proxy+}'

Приложение работает как автономное приложение, как уже говорилось. Файл, отправленный через POST, правильно прочитан и передан в библиотеку Docxtemplater. Но в AWS Lambda файл всегда поврежден. Не только с файлами docx. Любой отправленный файл определяется как поврежденный.

Это сообщение об ошибке при вызове нового JSZip (data)

End of data reached (data length = 403921, asked index = 70664704). Corrupted zip ?

Мое предположение: файл не отправляется как двоичный файл . Но я не знаю, как настроить сервер, чтобы заставить лямбду это делать.

...