Загрузите txt-файл через FTP с помощью Async и Promises в Node и AWS Lambda

Я использую один модуль Node basic-ftp для загрузки txt-файла в AWS Lambda и размещения его в каталоге /tmp/ внутри функции Lambda.

Затем я хочу работать с текстовым файлом и его содержимым вне функции FTP.

Я использую Async и Promises и немного запутался в коде. Текущая ошибка, возвращаемая в AWS Lambda,

module initialization error: ReferenceError
      await finalData = (() => {
      ^^^^^^^^^^^^^^^

результат этой строки await finalData = (() => {

Может ли кто-нибудь помочь исправить это и помочь мне получить доступ к finalData вне функции FTP?

var fs = require('fs');
var ftp = require("basic-ftp");
var path = require('path');

exports.handler = async (event, context, callback) => {

var fullPath = event.line_items[0].meta_data[2].value.tmp_name; // File path on Linux server -------
var myFileNameWithExtension = path.basename(fullPath); // Uploaded filename with the file extension eg. filename.txt

// FTP Function - Download from FTP and write to /tmp/ within AWS Lambda function
example()
//example().then(finalData=> callback(finalData))

async function example() {
    var finalData = '';

    const client = new ftp.Client()
    client.ftp.verbose = true
    try {
    await client.access({
        host: "XXXX",
        user: "XXXX",
        password: "XXXX",
    })

    let writeStream = fs.createWriteStream('/tmp/' + myFileNameWithExtension);
    await client.download(writeStream, myFileNameWithExtension)

    await finalData = (() => {
        return new Promise((resolve, reject) => {

        writeStream
            .on('finish', () => {
            fs.readFile("/tmp/" + myFileNameWithExtension, function (err, data) {
                if (err) {
                reject(err)
                } else {
                console.info('Contents of AWS Lambda /tmp/ directory', data);
                resolve(data);
                }
            });
            })
            .on('error', (err) => {
            console.info(err);
            reject(err);
            })
        })
    })();
    }
    catch (err) {
    console.info(err)
    }
    client.close();
    return finalData;
}

// Output contents of downloaded txt file into console and use in later code outside of the FTP function
console.info("Raw text:\n" + finalData.Body.toString('ascii'));

};

Попробуйте использовать finalData = await (() =>....

Luca Kiebel 18.02.2019 21:46

С этим немного лучше, теперь отображается как finalData is not defined

Gracie 18.02.2019 21:50
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
468
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

finalData определяется только в примере, который его возвращает, но вы ничего не присваиваете. В сочетании с комментарием Луки Кибеля попробуйте добавить

const finalData = await example();

затем выйдите из системы.

Поскольку finalData определен в примере функции, он доступен только внутри этой функции и любой функции, определенной в этой функции.

Вы не знаете JS объясняет это лучше, чем я могу

Прямо под строкой // Функция FTP — загрузка с FTP и запись в /tmp/ внутри функции AWS Lambda Возможно, вам также придется переместить это в объявление example()

Thomas Prince 18.02.2019 22:15

Теперь это выглядит намного лучше, просто нужно выяснить, как использовать finalData дальше в коде вне функции FTP. Когда я пытаюсь вывести содержимое на консоль с помощью console.info("Raw text:\n" + finalData.Body.toString('ascii'));, я получаю сообщение об ошибке Cannot read property 'toString' of undefined

Gracie 18.02.2019 22:24

Вывод файла TXT представляет собой двоичные данные, записанные из fs.readFile("/tmp/" + myFileNameWithExtension, function (err, data) Возможно, это вызывает ошибку toString? Или, может быть, как файл txt написан с помощью createWriteStream

Gracie 18.02.2019 22:29

Возможно. Что такое .Body? Я не вижу этого в документах буфера. finalData - это объект буфера, поэтому, может быть, просто вызовите finalData.toString('ascii')?

Thomas Prince 18.02.2019 22:42

Не знаю, откуда пришло это Тело. Теперь выводит с UTF-8. Большое спасибо :-)

Gracie 18.02.2019 22:55

Фантастика! Рад помочь

Thomas Prince 18.02.2019 23:40

Другие вопросы по теме