Javascript AWS Lambda中的FTP-发布下载文件(异步/等待)
我一直在努力使用各种FTP节点模块,试图在AWS Lambda中实现任何功能。最好也是最流行的似乎是“基本FTP”,它也支持异步/等待。但我就是不能让它下载文件时,任何代码下添加的FTP功能 我不想在FTP async函数中添加fs函数,因为我需要解决在添加以下任何代码时导致中断的原因,我还需要添加其他代码位,并在以后处理下载的文件及其内容: FTP成功-仅在异步函数下面没有fs代码的情况下使用 FTP故障-在下面添加fs readdir/readFile函数或任何其他代码 错误错误:enoint:没有这样的文件或目录,打开“/tmp/document.txt”Javascript AWS Lambda中的FTP-发布下载文件(异步/等待),javascript,node.js,amazon-web-services,ftp,aws-lambda,Javascript,Node.js,Amazon Web Services,Ftp,Aws Lambda,我一直在努力使用各种FTP节点模块,试图在AWS Lambda中实现任何功能。最好也是最流行的似乎是“基本FTP”,它也支持异步/等待。但我就是不能让它下载文件时,任何代码下添加的FTP功能 我不想在FTP async函数中添加fs函数,因为我需要解决在添加以下任何代码时导致中断的原因,我还需要添加其他代码位,并在以后处理下载的文件及其内容: FTP成功-仅在异步函数下面没有fs代码的情况下使用 FTP故障-在下面添加fs readdir/readFile函数或任何其他代码 错误错误:enoin
问题是,在处理程序中创建异步函数时,您会迷失方向。由于
example()
是异步的,因此它返回一个承诺。但是你不需要等待它,所以按照编码的方式,它有点像一场火灾,然后忘记它。此外,您的Lambda将在触发回调之前终止,因此即使下载了Lambda,您也无法看到它
我建议您将回调封装在承诺中,这样您就可以方便地从处理程序函数中等待它们
我已经设法让它工作了:我使用了https://dlptest.com/ftp-test/
用于测试,因此相应地更改它。此外,请注意,我自己已经上传了该文件。因此,如果您想复制这个示例,只需在项目的根目录上创建一个readme.txt并上传它。如果FTP服务器上已经有这个readme.txt文件,只需删除上传文件的行即可
下面是一个工作示例:
const ftp = require("basic-ftp");
const fs = require("fs");
const FileNameWithExtension = "readme.txt";
module.exports.hello = async (event) => {
const client = new ftp.Client();
try {
await client.access({
host: 'ftp.dlptest.com',
user: 'dlpuser@dlptest.com',
password: 'puTeT3Yei1IJ4UYT7q0r'
});
console.log(await client.list());
await client.upload(fs.createReadStream(FileNameWithExtension), FileNameWithExtension)
await client.download(fs.createWriteStream('/tmp/' + FileNameWithExtension), FileNameWithExtension);
}
catch (err) {
console.log('logging err')
console.log(err);
}
client.close();
console.log(await readdir('/tmp/'))
console.log(await readfile('/tmp/', FileNameWithExtension))
return {
statusCode: 200,
body: JSON.stringify({message: 'File downloaded successfully'})
}
};
const readdir = dir => {
return new Promise((res, rej) => {
fs.readdir(dir, function (err, data) {
if (err) {
return rej(err);
}
return res(data)
});
})
}
const readfile = (dir, filename) => {
return new Promise((res, rej) => {
fs.readFile(dir + filename, 'utf8', function (err, data) {
if (err) {
return rej(err);
}
return res(data)
})
})
}
以下是Lambda函数的输出:
下面是完整的CloudWatch日志:
我的文件里面只包含一个“你好”。你可以在日志上看到它
请记住,在Lambda函数中,将任何内容下载到/tmp时都有512MB的限制。你可以在中看到限制谢谢,格雷西。很高兴我能帮忙
const ftp = require("basic-ftp");
const fs = require("fs");
const FileNameWithExtension = "readme.txt";
module.exports.hello = async (event) => {
const client = new ftp.Client();
try {
await client.access({
host: 'ftp.dlptest.com',
user: 'dlpuser@dlptest.com',
password: 'puTeT3Yei1IJ4UYT7q0r'
});
console.log(await client.list());
await client.upload(fs.createReadStream(FileNameWithExtension), FileNameWithExtension)
await client.download(fs.createWriteStream('/tmp/' + FileNameWithExtension), FileNameWithExtension);
}
catch (err) {
console.log('logging err')
console.log(err);
}
client.close();
console.log(await readdir('/tmp/'))
console.log(await readfile('/tmp/', FileNameWithExtension))
return {
statusCode: 200,
body: JSON.stringify({message: 'File downloaded successfully'})
}
};
const readdir = dir => {
return new Promise((res, rej) => {
fs.readdir(dir, function (err, data) {
if (err) {
return rej(err);
}
return res(data)
});
})
}
const readfile = (dir, filename) => {
return new Promise((res, rej) => {
fs.readFile(dir + filename, 'utf8', function (err, data) {
if (err) {
return rej(err);
}
return res(data)
})
})
}