首页 > 解决方案 > 为什么我不能在 .map() 之外填充数组

问题描述

我已经尝试了两天来解决这个问题,现在我只是在循环编码。所有数据都得到处理,但我无法从 .map 函数之外的 s3.upload 函数返回数据。我错过了什么?

if (req.files['altImage']) {
    let result = '';
    let dataArr = new Array();
    const fileArr = req.files['altImage'];

    fileArr.map(async file => {
      const fileName = file.filename;
      const filePath = file.path;
      const stream = fs.createReadStream(filePath);
      const params = {
        ACL: 'public-read',
        Bucket: process.env.AWS_S3_BUCKET,
        Body: stream,
        Key: `${folder}/${fileName}`,
      };

      const s3Upload = s3.upload(params).promise()
      s3Upload
        .then(async () => {
          await fs.unlinkSync(filePath);
          result = await Promise.resolve(s3Upload);
          //  returns the exact data I need
          console.log('result', result);
          await dataArr.push(result);
        })
        .catch((err) => {
          console.log(err);
        });
      })

    console.log('dataArr', dataArr);
    //  dataArr is empty

    return {message: 'uploaded', data: dataArr};
  }
});

标签: javascriptnode.jsamazon-s3

解决方案


这可能是修复代码的最快方法:

if (req.files['altImage']) {
    let result = '';
    const fileArr = req.files['altImage'];

    const requests = fileArr.map(file => {
        const fileName = file.filename;
        const filePath = file.path;
        const stream = fs.createReadStream(filePath);
        const params = {
            ACL: 'public-read',
            Bucket: process.env.AWS_S3_BUCKET,
            Body: stream,
            Key: `${folder}/${fileName}`,
        };

        return s3.upload(params).promise()
            .then(async result => {
                await fs.unlinkSync(filePath));
                return result;
            })
            .catch((err) => {
                console.log(err);
            });
    });

    Promise.all(requests).then(dataArr => res.send({
        message: 'uploaded',
        data: dataArr
    }));
}

说明:你是dataArr异步填充的(因为s3请求是异步的),所以需要等待请求结束后再返回。

此外,使用 Express.js,您不只是返回结果,而是将其传递给res表示响应的对象。


推荐阅读