为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

POPMUISE 2022-12-02 16:22:48
在下面的函数中,我试图返回一个文件,但它在搜索文件时返回未定义,它返回未定义。我在哪里执行搜索并获取 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);  })}编辑-删除等待在功能部分保持返回问题:它在函数执行之前返回空数组。有人可以帮忙吗?我究竟做错了什么?
查看完整描述

3 回答

?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

问题在于竞争条件。它甚至在等待数组被填充之前就返回了。


我认为这个解决方案可能有效。


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);

    });

  });

};


查看完整回答
反对 回复 2022-12-02
?
萧十郎

TA贡献1815条经验 获得超13个赞

你从错误的地方回来了。您的返回语句在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);

        });

    })

}


查看完整回答
反对 回复 2022-12-02
?
12345678_0001

TA贡献1802条经验 获得超5个赞

下面的代码片段可能不一定能回答原来的问题,但如果 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方法转换为承诺。它将使代码更具可读性。


注意:我在代码中添加了一些变量,请确保根据您的代码上下文更改它们。


查看完整回答
反对 回复 2022-12-02
  • 3 回答
  • 0 关注
  • 105 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号