使用部署到AWS Lambda的Express应用处理二进制文件时出错

时间:2019-05-21 13:38:01

标签: amazon-web-services express aws-lambda serverless-framework

我要将一个旧的现有Express应用程序移植到AWS Lambda。该应用程序仅包含1个端点,并且操作非常简单:

  1. 通过POST请求接收docx文件
  2. 操纵文件的内容
  3. 将docx文件的修改后的副本发送给发件人。

就是这样。 它在VPS中可作为独立应用程序使用。但是,当使用无服务器部署到Lambda 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 ?

我的猜测:文件不是以二进制格式发送的。但是我不知道如何配置无服务器来告诉lambda做到这一点。

0 个答案:

没有答案