Мне нужно иметь возможность захватывать объекты s3 на моем node.js сервере и предоставлять их для загрузки в моем ответе. js клиент.
Эта функция работала нормально, пока я не попробовал большой файл (почти 4 ГБ).
Затем я понял, что мне нужно предотвратить повторные запросы для одного и того же объекта и предложить пользователю обратную связь и варианты отмены.
На самом деле я так и не получил запрос на файл размером 4 ГБ для загрузки на клиенте, даже после ожидания в течение 10 минут (сервер node.js расположен на AWS серверах, и соединение с s3 должно быть достаточно быстрым).
Эта функция вызвала некоторые проблемы, такие как сервер начиная с ошибки 502 для каждого запроса, так как он зависает на этой функции.
Я думаю, что когда я отменяю запрос, сервер зависает на функции, вероятно, потому что я вызываю и request.abort()
, и await request.promise()
.
Код сервера следующий:
async function getOutputs(req, request, userBucket) {
let canceled = false;
req.on('close', function (err){
canceled = true;
});
const requestModel = await Request.findOne({where: {id: request}});
if(!requestModel){
return {
code: 400,
data: ['Invalid Request'],
};
}
const m = moment.utc(requestModel.dataValues.timestamp);
m.tz('Europe/Madrid');
const filePath = 'root/' + userBucket + '/' + m.format("YYYYMMDDHHmmss") + '/output/results.zip';
const s3params = {
Bucket: bucket,
Key: filePath,
};
try{
const request = s3.getObject(s3params).on('httpData', function(chunk){
if(canceled) {
request.abort();
}
});
const result = await request.promise();
return {
code: 202,
data: result.Body,
};
} catch(error) {
return {
code: 400,
data: ['Report not yet available, please try again later'],
};
}
}
С учетом сказанного у меня есть два вопроса: как мне получить отмененные запросы, чтобы они не зависали на подаче. r, и есть ли ограничение на s3 для больших файлов, о которых я не знаю?
Спасибо.