NodeJS: Promise.all() не ждет, пока ведро S3 завершит выполнение
Чтобы загрузить файл в ведро S3, мне удалось использовать следующую функцию.
public async uploadFile() {
try {
return new Promise(async (resolve) => {
const resolution = [
{ key: 'thumbnail', value: { height: 256, width: 256 }},
{ key: 'small', value: { height: 72, width: 72 }},
]
resolution.forEach(size => {
Sharp(buffer)
.resize(size.value).toBuffer()
.then(async data => {
var object = {
Body: data,
Bucket: ENV.BUCKET_NAME,
Key: `${size.key}/${imglabel}/${keys}.${fileExt}`,
ServerSideEncryption: "AES256",
};
bulkOfBody.push(object)
responses = await Promise.all(
bulkOfBody.map(param => s3.upload(param).promise())
)
if (responses.length === 2) {
resolve(responses);
}
})
})
})
} catch (error) {
throw error;
}
}
Теперь, после того, как S3 завершит процесс загрузки, мне нужно обработать его ответ, но хотя я справился с этим методом; Я не могу справиться с ответом. И текущий сценарий таков, что
Promise.all()
вернуть
undefined
ответ, не дожидаясь завершения выполнения S3.
public async processProductImage(images) {
let uploadImagetoS3 = images.map(async (ele) => {
return new Promise(async (resolve, reject) => {
const productImageObj = ele;
await productImageRepo.uploadFile().then(async (response: any) => {
// doing the process to store image URL into DB after getting response from S3 bucket object
response.forEach(obj => {
storeImage.push(obj.Location)
})
}
})
})
})
Promise.all(uploadImagetoS3).then((response) => {
console.log("response - ", response); // it logs after Promise.all() executed.
return 'Success';
})
}
Наконец, отправка этого ответа в контроллер, который будет отвечать за отправку ответа в API, но, к сожалению, постоянно получать неопределенный ответ.
public async setProductImages(req: Request, res: Response, next: NextFunction) {
try{
let imagesExecution = _campaignProducts.map(async productID => {
return new Promise(async (resolve, reject) => {
await axios({ method: 'get', url: `${ENV.API_ENDPOINT}/?id=${id}` })
.then(async res => {
await repository.processProductImage(productImages).then((imageres) => {
resolve(imageres)
});
})
})
})
Promise.all(imagesExecution).then(async (response) => {
console.log(response)
res.status(200).json({ "data": response })
})
}
}
PS: Я тоже проверил этот ответ, но не смог обработать ответ после того, как S3 завершит его выполнение. https://stackoverflow.com/a/66404490/5624578