загрузка файлов в aws s3 с узла js

#node.js #amazon-s3

#node.js #amazon-s3

Вопрос:

Я использую 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 = ожидание newPost.save();

в этом случае при запуске .save в mongodb ссылки на imgLinks из aws пока отсутствуют. Как я могу это исправить.

Я уже пробовал асинхронный, и это не сработало

Ответ №1:

Вам необходимо использовать 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;
}
  

Ответ №2:

Если вы используете await s3.upload метод on, вы должны удалить обратный вызов для этого метода.

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

Дайте мне знать, если это сработает.

Комментарии:

1. по какой-то причине он не работает. когда я выхожу из системы, эти данные отображаются в консоли. в нем говорилось, что данные не определены. Или я думаю, что в моем коде есть опечатка или пропущены некоторые слова