Пользовательский контейнер Nodejs AWS Lambda показывает ошибку времени выполнения

Я создал функцию AWS Lambda с пользовательским образом контейнера. Я пытаюсь преобразовать файл Excel в PDF с помощью Libreoffice - получить файл из S3, сохранить его в файл и преобразовать его в PDF, а затем загрузить его обратно в S3.

Вот код.

      const fs = require('fs');
const getStream = require('get-stream');
const { Readable } = require('stream')
const { S3Client, GetObjectCommand, PutObjectCommand } = require("@aws-sdk/client-s3");
const libre = require('libreoffice-convert');
const path = require('path');

exports.handler = async (event) => {

    const bucket = event.queryStringParameters.bucket;
    const file = event.queryStringParameters.file;
    const convertedFile = event.queryStringParameters.convertedFile;

    if (event.queryStringParameters['warmup'] !== undefined) {
        return {
            result: true,
            message: 'warmed up'
        }
    }

    const client = new S3Client({ region: "ap-south-1" });
    const command = new GetObjectCommand({ Bucket: bucket, Key: file });
    const response = await client.send(command);
    const objectData = response.Body;    
    const writeStream = fs.createWriteStream("/tmp/sample.xlsx");
    objectData.pipe(writeStream);
    
    var end = new Promise((resolve, reject) => {
        objectData.on('close', resolve(true));
        objectData.on('end', resolve(true));
        objectData.on('error', reject(false));
    });

    let completed = await end;

    if (completed) {        
        const extend = '.pdf'        
        const outputPath = `/tmp/sample${extend}`;  
        const enterPath = '/tmp/sample.xlsx';

        var readingFile = new Promise((resolve, reject) => {
            fs.readFile(enterPath, (err, data)=>{
                if (err) {
                    reject(false);
                }

                resolve(data);
            });
        });
        
        var fileData = await readingFile;

        var converting = new Promise((resolve, reject) => {
            libre.convert(fileData, extend, undefined, (err, done) => {
                if (err) {
                    reject(false)
                }
    
                fs.writeFileSync(outputPath, done);
                resolve(true)
            });
        })

        var converted = await converting;

        if (converted) {
            var convertedFileStream = fs.createReadStream(outputPath);
            const uploadCommand = new PutObjectCommand({ Bucket: bucket, Key: convertedFile, Body: convertedFileStream });
            const lastResponse = await client.send(uploadCommand);

            const returnResponse = {
                result: true,
                message: 'success',
                bucket: event.queryStringParameters.bucket,
                file: event.queryStringParameters.file,
                convertedFile: event.queryStringParameters.convertedFile
            };

            if (event.queryStringParameters['returnEvent'] !== undefined) {
                returnResponse['returnEvent'] = event;
            }

            return returnResponse;
        }
    }

    return completed;
};

Однако время от времени я получаю эту ошибку. Иногда это успех, но иногда возникает эта ошибка.

      {
    "errorType": "Error",
    "errorMessage": "false",
    "stack": [
        "Error: false",
        "    at _homogeneousError (/function/node_modules/aws-lambda-ric/lib/Runtime/CallbackContext.js:56:16)",
        "    at postError (/function/node_modules/aws-lambda-ric/lib/Runtime/CallbackContext.js:72:34)",
        "    at done (/function/node_modules/aws-lambda-ric/lib/Runtime/CallbackContext.js:99:13)",
        "    at fail (/function/node_modules/aws-lambda-ric/lib/Runtime/CallbackContext.js:113:13)",
        "    at /function/node_modules/aws-lambda-ric/lib/Runtime/CallbackContext.js:148:24",
        "    at processTicksAndRejections (internal/process/task_queues.js:97:5)"
    ]
}

Я не очень разбираюсь в Nodejs, поэтому думаю, что если код написан неправильно. Есть идеи, что я здесь делаю неправильно?

1 ответ

Как и @hoangdv, когда я регистрировал ошибки, я узнал, что сохранение файла на диск было неправильным. Итак, я изменил область кода, в которой он сохраняется, как это, и тогда это сработало.

          const client = new S3Client({ region: "ap-south-1" });
    const command = new GetObjectCommand({ Bucket: bucket, Key: file });
    const { Body } = await client.send(command);

    await new Promise((resolve, reject) => {
        Body.pipe(fs.createWriteStream(filePath))
            .on('error', err => reject(err))
            .on('close', () => resolve())
    })
    
    const excelFile = fs.readFileSync(filePath);
Другие вопросы по тегам