Asyn c Время ожидания метода в Nodejs - PullRequest
0 голосов
/ 14 февраля 2020

Я загружаю файл, и иногда размер файла может быть большим, а таймаут недостаточен. по истечении времени ожидания я хотел бы отменить процесс загрузки, поскольку даже при получении ошибки времени ожидания он продолжает обрабатывать файл и выдает следующее исключение

_http_outgoing. js: 470 throw new ERR_HTTP_HEADERS_SENT (' набор'); ^

Ошибка [ERR_HTTP_HEADERS_SENT]: Невозможно установить заголовки после того, как они отправлены клиенту в ServerResponse.setHeader (_http_outgoing. js: 470: 11)

вот моя асинхронность c method

router.get('/api/files/GetFile', urlencodedParser, (req, res) => { 

 return new Promise(function (resolve, reject) {    
    (async function () {
      try {

        var folderName = "File_" + moment().format('DD-MM-YYYY HH_mm_ss');
        await routerFile.CreatePdfZip(req.query.VoucherCodes, req.query.AppNames, folderName);

        var fullzipPath = './FilesToDownload/' + folderName + '.zip';

        zipFolder('./FilesToDownload/' + folderName, './FilesToDownload/' + folderName + '.zip', function (err) {
          if (err) {
            return reject(err);
          } else {

            console.log('zip created');
            rimraf('./FilesToDownload/' + folderName, function () {
              console.log("folder has been deleted");
            });

            fs.readFile(fullzipPath, (err2, zipData) => {
              if (err2) reject(err2);

              const base64 = zipData.toString('base64');
              res.setHeader('Content-type', 'application/zip');
              res.type('zip');
              res.end(base64, 'binary');
              console.log('EXCELLENT');
            });
          }
        });       
      } catch (error) {    
        return reject(error);
      }
    })();
    }).catch(error => {
      console.log(error);
      res.send(error);
   });
});

Ошибка возникает в строке res.setHeader ('Content-type', 'application / zip');

PS: переменная router происходит от const router = express .Router ();

и здесь задано время ожидания

const app = express();
app.use(timeout('2s'));
app.use(bodyParser());
app.use(haltOnTimedout);
app.use(cookieParser());
app.use(haltOnTimedout);

function haltOnTimedout(req, res, next) {
  if (!req.timedout)
    next();
  else {
    console.log('TIMEOUT.----------------------------------------------');    
  }
}

Что я здесь не так делаю? Или есть лучший способ установить тайм-аут и отменить процесс загрузки

PS: метод CreatePdfZip требует времени.

1 Ответ

1 голос
/ 14 февраля 2020

Чтобы избежать этой ошибки, вы можете проверить, отправлено ли response, и отправил ответ только в том случае, если он не отправлен (но на самом деле не решает / не отменяет обработку загрузки)

...
fs.readFile(fullzipPath, (err2, zipData) => {
    if (err2) reject(err2);

    if (!res.headersSent) {
        const base64 = zipData.toString('base64');
        res.setHeader('Content-type', 'application/zip');
        res.type('zip');
        res.end(base64, 'binary');
        console.log('EXCELLENT');
    }
});
...

Do c Ссылка

...