我要将一个旧的现有Express应用程序移植到AWS Lambda。该应用程序仅包含1个端点,并且操作非常简单:
就是这样。 它在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做到这一点。