Я использую один модуль 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 is not defined



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


finalData определяется только в примере, который его возвращает, но вы ничего не присваиваете. В сочетании с комментарием Луки Кибеля попробуйте добавить
const finalData = await example();
затем выйдите из системы.
Поскольку finalData определен в примере функции, он доступен только внутри этой функции и любой функции, определенной в этой функции.
Вы не знаете JS объясняет это лучше, чем я могу
Прямо под строкой // Функция FTP — загрузка с FTP и запись в /tmp/ внутри функции AWS Lambda Возможно, вам также придется переместить это в объявление example()
Теперь это выглядит намного лучше, просто нужно выяснить, как использовать finalData дальше в коде вне функции FTP. Когда я пытаюсь вывести содержимое на консоль с помощью console.info("Raw text:\n" + finalData.Body.toString('ascii'));, я получаю сообщение об ошибке Cannot read property 'toString' of undefined
Вывод файла TXT представляет собой двоичные данные, записанные из fs.readFile("/tmp/" + myFileNameWithExtension, function (err, data) Возможно, это вызывает ошибку toString? Или, может быть, как файл txt написан с помощью createWriteStream
Возможно. Что такое .Body? Я не вижу этого в документах буфера. finalData - это объект буфера, поэтому, может быть, просто вызовите finalData.toString('ascii')?
Не знаю, откуда пришло это Тело. Теперь выводит с UTF-8. Большое спасибо :-)
Фантастика! Рад помочь
Попробуйте использовать
finalData = await (() =>....