Javascript AWS Lambda中的FTP-发布下载文件(异步/等待)

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

我一直在努力使用各种FTP节点模块,试图在AWS Lambda中实现任何功能。最好也是最流行的似乎是“基本FTP”,它也支持异步/等待。但我就是不能让它下载文件时,任何代码下添加的FTP功能

我不想在FTP async函数中添加fs函数,因为我需要解决在添加以下任何代码时导致中断的原因,我还需要添加其他代码位,并在以后处理下载的文件及其内容:

FTP成功-仅在异步函数下面没有fs代码的情况下使用

FTP故障-在下面添加fs readdir/readFile函数或任何其他代码

错误错误:enoint:没有这样的文件或目录,打开“/tmp/document.txt”


问题是,在处理程序中创建异步函数时,您会迷失方向。由于
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)
    })
  })
}