Уверен, ваш 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
абсолютным относительным путем.