Загрузите файл через FTP, запишите в / tmp / и выведите содержимое .txt на консоль с помощью AWS Lambda. - PullRequest
0 голосов
/ 16 февраля 2019

Я использую только один пакет Node, basic-ftp, чтобы попытаться загрузить файл TXT и записать содержимое в консоль.Далее я буду редактировать текст, поэтому нужно будет использовать fs.Просто изо всех сил пытаюсь работать с выводом createWriteStream из программы FTP.

Может ли кто-нибудь помочь мне записать TXT-файл в / tmp / file в AWS Lambda, а затем правильный синтаксис для открытия и редактированияфайл после createWriteStream был использован?

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

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

var fullPath = "/home/example/public_html/_uploads/15_1_5c653e6f6780f.txt"; //  File Name FULL PATH -------
const extension = path.extname(fullPath); // Used to calculate filenames below
const wooFileName = path.basename(fullPath, extension); // Uploaded filename  with no path or extension eg. filename
const myFileNameWithExtension = path.basename(fullPath); // Uploaded filename  with the file extension eg. filename.txt
const FileNameWithExtension = path.basename(fullPath); // Uploaded filename  with the file extension eg. filename.txt

example()

async function example() {
    const client = new ftp.Client()
    client.ftp.verbose = true
    try {
        await client.access({
            host: "XXXX",
            user: "XXXX",
            password: "XXXX",
            //secure: true
        })
        await client.download(fs.createWriteStream('./tmp/' + myFileNameWithExtension), myFileNameWithExtension)
    }
    catch(err) {
        console.log(err)
    }
    client.close()
}

//Read the content from the /tmp directory to check it's empty
fs.readdir("/tmp/", function (err, data) {
    console.log(data);
    console.log('Contents of AWS Lambda /tmp/ directory');
});

/*
downloadedFile = fs.readFile('./tmp/' + myFileNameWithExtension)
console.log(downloadedFile)
console.log("Raw text:\n" + downloadedFile.Body.toString('ascii'));
*/

}

1 Ответ

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

Уверен, ваш fs.createWriteStream() должен использовать абсолютный путь к /tmp в Lambdas.Ваш фактический рабочий каталог - var/task, а не /.

Кроме того, если вы используете fs.createWriteStream () , вам нужно дождаться события finish перед тем, какчтение из файла.Примерно так:

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

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

        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;
}

Вам также понадобится получить доступ к file с помощью fs.readFile () .То, что вы использовали fs.readdir () дает вам список файлов в каталоге, а не его содержимое.

Если вы хотите использовать readdir (), вы можете сделать это следующим образом, но, как вы можете видеть, это избыточно в вашем случае.Для обработки ошибок я бы предложил просто обработать событие error в начальном createWriteStream() вместо добавления этой дополнительной служебной информации (добавлено в предыдущий пример) ...

       writeStream
          .on('finish', ()=>{
           fs.readdir('/tmp',(err, files)=> {
               let saved = files.find(file => file === myFileNameWithExtension);
               fs.readFile("/tmp/"+saved, function (err, data) {
                 if (err) throw new Error();
                 console.log(data);
                 console.log('Contents of AWS Lambda /tmp/ directory');
               });
           })
          })
          .on('error', (err)=> {
             console.log(err);
             throw new Error();
          })

ПРИМЕЧАНИЕ: Пожалуйста, выйдите из результата saved, я не могу вспомнить, является ли массив files абсолютным относительным путем.

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