繁体   English   中英

从节点 js 上传文件到 aws s3

[英]upload files to aws s3 from node js

我正在使用 aws sdk 上传用户输入图像,然后从 aws 获取图像链接,我会将链接存储在 mongoDB 中。 在这种情况下,当我运行 .upload() 时它是异步的。

const imgSRC = [];


for (let img of image) {
console.log(img);
const params = {
  Bucket: process.env.AWS_BUCKET,
  Key: `${img.originalname}_${userID}`,
  Body: img.buffer,
};
s3.upload(params,  (error, data) => {
  if (error) {
    console.log(error);
    res.status(500).json({ msg: "server error" });
  }
   imgSRC.push(data.Location);
  console.log(imgSRC);
});

}

const newPost = new Post({
userID: userID,
contentID: contentID,
posts: [
  {
    caption: caption,
    data: imgSRC,
  },
],

}); const post = await newPost.save();

在这种情况下,当 .save to mongodb 运行时,还没有来自 aws 的 imgLinks。 我该如何解决这些问题。

我已经尝试过异步,但没有用

您需要以这种方式使用Promise.all()

const uploadImage = (obj) => {
  return new Promise((resolve, reject) => {
    const params = {
      Bucket: process.env.AWS_BUCKET,
      Key: obj.key,
      Body: obj.body,
    }
    s3.upload(params, (error, data) => {
      if (error) {
        console.log(error);
        return reject(error);
      }
      return data;
    });
  })
}

const mainFunction = async () => {
  const promises = [];
  for (let img of image) {
    const options = {
      key: `${img.originalname}_${userID}`,
      body: img.buffer
    };
    promises.push(uploadImage(options));
  }
  const result = await Promise.all(promises);
  const imgSRC = result.map((r) => { return r.Location });
  return imgSRC;
}

如果您在s3.upload方法上使用await ,您应该删除此方法的回调。

try {
  const data = await s3.upload(params);
  imgSRC.push(data.Location);
  console.log(imgSRC);
} catch(e) {
  console.log(error);
  res.status(500).json({ msg: "server error" });
}

让我知道它是否有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM