#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. по какой-то причине он не работает. когда я выхожу из системы, эти данные отображаются в консоли. в нем говорилось, что данные не определены. Или я думаю, что в моем коде есть опечатка или пропущены некоторые слова