I'm currently creating an AWS Lambda function to convert office files to pdf using LibreOffice in a Lambda Layer.
So I have used code from a developer and I'm trying to make it work but every time I try something else I get another error, this time I feel I'm close to success but the following error keeps appearing when I test the function:
"errorType": "TypeError", "errorMessage": "Cannot read properties of undefined (reading '0')", "trace": [ "TypeError: Cannot read properties of undefined (reading '0')", " at Runtime.module.exports.handler (/var/task/index/index.js:36:23)", " at runMicrotasks ()", " at processTicksAndRejections (node:internal/process/task_queues:96:5)"
I'm sure the error lies @ line 36 but not sure how to fix it?
Below is the code:
const https = require('https');
const path = require('path');
const fs = require('fs');
var async = require('async');
const {writeFileSync} = require('fs');
const lambdafs = require('lambdafs');
const {execSync} = require('child_process');
var AWS = require('aws-sdk');
const inputPath = path.join( '/opt', 'lo.tar.br');
const outputPath = '/tmp/';
const bucketName = 'doc-conversion-tests';
module.exports.handler = async (event, context) => {
console.log(execSync('ls -alh /opt').toString('utf8'));
try {
// Decompressing
let decompressed = {
file: await lambdafs.inflate(inputPath)
};
console.log('output brotli de:----', decompressed);
} catch (error) {
console.log('Error brotli de:----', error);
}
try {
console.log(execSync('ls -alh /opt').toString('utf8'));
} catch (e) {
console.log(e);
}
var body = "";
//S3 put event
body = event.Records[0].body;
console.log('s3 bucket file name from event:', body);
// get file from s3 bucket
var s3fileName = body;
var newFileName = Date.now()+'.pdf';
var s3 = new AWS.S3({apiVersion: '2006-03-01'});
var fileStream = fs.createWriteStream('/tmp/'+s3fileName);
var getObject = function(keyFile) {
return new Promise(function(success, reject) {
s3.getObject(
{ Bucket: bucketName, Key: keyFile },
function (error, data) {
if(error) {
reject(error);
} else {
success(data);
}
}
);
});
}
let fileData = await getObject(s3fileName);
try{
fs.writeFileSync('/tmp/'+s3fileName, fileData.Body);
} catch(err) {
// An error occurred
console.error('file write:', err);
}
const convertCommand = `export HOME=/tmp && /tmp/lo/instdir/program/soffice.bin --headless --norestore --invisible --nodefault --nofirststartwizard --nolockcheck --nologo --convert-to "pdf:writer_pdf_Export" --outdir /tmp /tmp/${s3fileName}`;
try {
console.log(execSync(convertCommand).toString('utf8'));
} catch (e) {
console.log(execSync(convertCommand).toString('utf8'));
}
console.log(execSync('ls -alh /tmp').toString('utf8'));
function uploadFile(buffer, fileName) {
return new Promise((resolve, reject) => {
s3.putObject({
Body: buffer,
Key: fileName,
Bucket: bucketName,
}, (error) => {
if (error) {
reject(error);
} else {
resolve(fileName);
}
});
});
}
let fileParts = s3fileName.substr(0, s3fileName.lastIndexOf(".")) + ".pdf";
let fileB64data = fs.readFileSync('/tmp/'+fileParts);
await uploadFile(fileB64data, 'pdf/'+fileParts);
console.log('new pdf converted and uploaded!!!');
I'm no developer but can someone please help me to fix the error as I'm losing the will to live?
Please help!! - All suggestions welcomed.
Many thanks
Top comments (0)