在s3映射问题中使用节点上传多个图像

问题描述 投票:0回答:1

我正在努力寻找一种将两个文件上传到s3的解决方案。我可以使用multer上传一个文件,并且我已经学会了如何做。但是,当我尝试在formdata中的所有文件中进行映射并上传每个文件时,我将每个位置URL放入数组中,这是我保存的位置URL我的数据库。然后,我尝试打印每个URL,但令我惊讶的是,它们在if语句中打印,但是当我将其保存在if之外的数据库中时,却没有打印。可能是异步问题吗?谢谢。

tournamentsCtrl.createTournament = async (req, res) => {
    var files_upload = []
    if (req.files) {
        aws.config.setPromisesDependency();
        aws.config.update({
            accessKeyId: process.env.AWS_ACCESS_KEY_ID,
            secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
            //region: process.env.REGION
        });
        const s3 = new aws.S3();
        req.files.map((item) => {
            var params = {
                ACL: 'public-read',
                Bucket: process.env.AWS_BUCKET_NAME,
                Body: fs.createReadStream(item.path),
                Key: `tournament_img/${uuidv4()/* +req.file.originalname */}`
            };

            await s3.upload(params, (err, data) => {
                if (err) {
                    console.log('Error occured while trying to upload to S3 bucket', err);
                }
                if (data) {
                    fs.unlinkSync(item.path); // Empty temp folder
                    const locationUrl = data.Location;
                    files_upload.push(locationUrl);
                    console.log(files_upload)
                }
            });
        });
    }
    console.log(files_upload)
    const new_data = { ...JSON.parse(req.body.values), img_source: files_upload[0], info_url: files_upload[1] }
    console.log(new_data)
    const newUser = new Tournaments(new_data);
    newUser
        .save()
        .then(user => {
            res.json({ message: 'User created successfully', user });
        })
        .catch(err => {
            console.log('Error occured while trying to save to DB');
        });
};
node.js amazon-s3
1个回答
0
投票

如果您查看upload的文档,它不会返回Promise,因此您不应对其调用await。默认的映射方法与此格式的异步代码不兼容。您需要使用async.map或将异步代码包装在Promise中,例如

return await new Promise((resolve, reject) => {
...
    if (data) {
      fs.unlinkSync(item.path);
      resolve(data.location);
    }

}

您的其他代码也有一些问题。映射函数应返回一个值。如果您不想返回任何内容,则应使用foreach。

© www.soinside.com 2019 - 2024. All rights reserved.