猿问

在这里,我试图返回文件数组,但它返回未定义

在下面的函数中,我试图返回一个文件,但它在搜索文件时返回未定义,它返回未定义。我在哪里执行搜索并获取 S3 对象并准备对象数组以进一步发送电子邮件。


        const send_email = async(data) => {

          try {

         

            const data_attachment = await get_S3_files(batch_key);

        

            console.log(data_attachment)

            

          } catch (error) {

            console.log(error)

          }

        }

    

    const get_S3_files = (data) => {



 return new Promise((resolve, reject) => {

      var params = {

          Bucket: S3_bucket,

          Delimiter: '',

          Prefix: `${data}/`

      }

      var files = []

      s3.listObjects(params, function (err, data) {

          if (err) throw err;

          if (data.Contents.length) {

              for (const row of data.Contents) {

  

                  await s3.getObject({ Bucket: 'name', Key: row.Key }, function (err, data) {

                      if (err) {

                          console.log('S3 Get Object Error', err)

                          reject(err)

                      } else {

                          console.log(data)

                          files.push({

                              filename: data.Body,

                              content: data.Metadata.file_name,

                          })

  

                      }

                  })

              }

          }

      });

      

      resolve(files);

  })

}

编辑-


删除等待

在功能部分保持返回

问题:它在函数执行之前返回空数组。

有人可以帮忙吗?我究竟做错了什么?



POPMUISE
浏览 106回答 3
3回答

吃鸡游戏

问题在于竞争条件。它甚至在等待数组被填充之前就返回了。我认为这个解决方案可能有效。const send_email = async (data) => {  try {    const data_attachment = await get_S3_files(batch_key);    console.log(data_attachment);  } catch (error) {    console.log(error);  }};const get_S3_files = (batch_key) => {  return new Promise((resolve, reject) => {    var params = {      Bucket: S3_bucket,      Delimiter: "",      Prefix: `${batch_key}/`,    };    s3.listObjects(params, async function (err, data) {      var files = [];      if (err) throw err;      if (data.Contents.length) {        await Promise.all(          data.Contents.map((row) => {            return new Promise((resolve, reject) => {              s3.getObject({ Bucket: S3_bucket, Key: row.Key }, (err, data) => {                if (err) return reject(err);                files.push({                  filename: data.Body,                  content: data.Metadata.file_name,                });                return resolve(data);              });            });          })        );      }      return resolve(files);    });  });};

萧十郎

你从错误的地方回来了。您的返回语句在s3.listObjects函数内部。return files;应该在关闭函数之前的下面一行。但是,它无论如何都行不通。你必须承诺这个功能。const get_S3_files = (data) => {    return new Promise((resolve, reject) => {        var params = {            Bucket: 'name',            Delimiter: '',            Prefix: `${data}/`        }        var files = []        s3.listObjects(params, async function (err, data) {            if (err) throw err;            if (data.Contents.length) {                for (const row of data.Contents) {                        await s3.getObject({ Bucket: 'name', Key: row.Key }, function (err, data) {                        if (err) {                            console.log('S3 Get Object Error', err)                            reject(err)                        } else {                            console.log(data)                            files.push({                                filename: data.Body,                                content: data.Metadata.file_name,                            })                            }                    })                }            }            resolve(files);        });    })}

12345678_0001

下面的代码片段可能不一定能回答原来的问题,但如果 OP 愿意对其代码进行一些重大更改,那么我认为这个解决方案可以完美运行,而不会影响原来的功能。const get_S3_files = async (data) => {    var params = {        Bucket: 'name',        Delimiter: '',        Prefix: `${data}/`    }    var files = []    await s3.listObjects(params, async function (err, data) {        if (err) throw err;        if (data.Contents.length) {            for (const row of data.Contents) {                try {                    const dataContent = await s3.getObject({ Bucket: 'name', Key: row.Key }).promise();                    files.push({                        filename: dataContent.Body,                        content: dataContent.Metadata.file_name,                    })                } catch(err) {                    console.log('S3 Get Object Error', err);                }            }        }        return files;    });}到处使用回调会使代码不可读。我建议您使用promise()和 s3 sdk 的方法将您的响应转换为 promise。同样,您可以将listObjects方法转换为承诺。它将使代码更具可读性。注意:我在代码中添加了一些变量,请确保根据您的代码上下文更改它们。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答