DEV Community

Mark
Mark

Posted on

Nodejs 16x - AWS Lambda function with S3

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); 
Enter fullscreen mode Exit fullscreen mode

} 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!!!');
Enter fullscreen mode Exit fullscreen mode

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)