Загрузите текстовый файл через FTP с помощью Async & Promises в Node и AWS Lambda - PullRequest
0 голосов
/ 18 февраля 2019

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

Затем я хочу работать с txt-файломи его содержимое вне функции 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.log('Contents of AWS Lambda /tmp/ directory', data);
                resolve(data);
                }
            });
            })
            .on('error', (err) => {
            console.log(err);
            reject(err);
            })
        })
    })();
    }
    catch (err) {
    console.log(err)
    }
    client.close();
    return finalData;
}

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

};

1 Ответ

0 голосов
/ 19 февраля 2019

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

const finalData = await example();

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...