res.download () выдает ошибку «запрос прерван» при загрузке больших файлов - PullRequest
0 голосов
/ 18 января 2019

Моему приложению стека MEAN требуется функция, позволяющая пользователям выбирать любое количество файлов из списка файлов, доступных на s3, которые затем загружаются, архивируются и возвращаются пользователю для загрузки. Для очень больших файлов первоначальный запрос будет превышен по времени, пока загружаются / упаковываются большие файлы, поэтому теперь есть 3 отдельных запроса. Первый запрос - это POST, предоставляющий список файлов, который возвращает токен. Как только этот запрос возвращается, второй запрос GET с постоянным опросом отправляется с использованием этого токена, чтобы определить, завершена ли загрузка / архивирование. Это будет срабатывать раз в секунду, пока не получит желаемый ответ. Как только загрузка и архивирование файлов завершены, создается запись в БД, соответствующая предоставленному токену, который удовлетворяет второму запросу, теперь запускается GET третий и последний запрос, который является запросом на загрузку завершенного файла.

function downloadZip( req: Request, res: Response, next: Function ) {

if ( !req.params.token ) {
    return next( new Error( "downloadZip requires token." ) );
}

icmDownloadModel.findByToken( req.params.token, ( err, data ) => {

    if ( err ) {
        return next( err );
    }

    if ( data && data.fileName && data.token ) {

        let localPath: string = path.join( __dirname, "..", "uploads", data.token + '.zip' );

        res.download( localPath, data.fileName, err => {

            if ( err ) {
                return next( err );
            }

            fs.unlink( localPath );

            icmDownloadModel.delete( data._id, ( err ) => {
                if ( err ) {
                    next( err );
                }
            });

        } );

    } else {

        next( new Error( "Unable to locate file." ) );
    }

} );

};

Пока что это работает почти идеально, однако при попытке загрузить файлы размером 1 ГБ + я получаю сообщение об ошибке «запрос прерван». Файлы успешно загружаются с s3 и архивируются, но через несколько секунд res.download () исчезает. Мне удалось загрузить файлы размером более 250 МБ без проблем. Кроме того, это прекрасно работает на моем локальном экземпляре, но не работает в среде реального DEV.

Любая помощь будет оценена.

...