Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 为什么可以';在.map()之外填充数组_Node.js_Amazon S3 - Fatal编程技术网

Node.js 为什么可以';在.map()之外填充数组

Node.js 为什么可以';在.map()之外填充数组,node.js,amazon-s3,Node.js,Amazon S3,我花了两天的时间想弄明白这一点,现在我只是在循环编码。 所有的数据都得到了处理,但我无法从.map函数之外的s3.upload函数返回数据。我错过了什么 if (req.files['altImage']) { let result = ''; let dataArr = new Array(); const fileArr = req.files['altImage']; fileArr.map(async file => { const f

我花了两天的时间想弄明白这一点,现在我只是在循环编码。 所有的数据都得到了处理,但我无法从.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};
  }
});

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

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
对象。

我以为我在等待s3Upload中第一个承诺的响应。无论如何,最后一个承诺首先触发,并在上载4个图像后返回一个空响应-结果[undefined,undefined,undefined,undefined],undefined]然后返回console.log-{消息:“Upload”,数据:Array(0)}。在提交表单之前,我需要来自图像上传的数据来填充Angular客户端中的表单。我以为我在等待s3Upload中第一个承诺的响应。无论如何,最后一个承诺首先触发,并在上载4个图像后返回一个空响应-结果[undefined,undefined,undefined,undefined],undefined]然后返回console.log-{消息:“Upload”,数据:Array(0)}。在提交表单之前,我需要图像上传中的数据来填充Angular client中的表单。我的代码中有错误(对我来说很难,因为我无法测试),你能试试吗?