2016-10-25 6 views
0

У нас есть веб-приложение, которое при посещении URL-адреса подготовит и сгенерирует файл .zip, который затем загружается.HTTP-запросы до тех пор, пока заголовок не будет прикреплен

Мне нужно создать приложение nodejs, используя requestjs, который может обрабатывать запросы до тех пор, пока не появится заголовок вложения, с которого он будет загружен.

Страница, которая создает файл .zip, содержит простое html-сообщение, в котором говорится, что файл готовится для загрузки. С помощью функции javascript reload(true), вызываемой при загрузке.

Я не уверен, что это правильный способ сделать это, но я открыт для предложений.

ответ

1

Вы можете использовать async.until Переберите какая-то логика, пока заголовок не доступен:

let success = true; 
async.until(
    // Do this as a test for each iteration 
    function() { 
     return success == true; 
    }, 
    // Function to loop through 
    function(callback) { 
     request(..., function(err, response, body) { 
      // Header test 
      if(resonse.headers['Content-Disposition'] == 'attatchment;filename=...') { 
       response.pipe(fs.createWriteStream('./filename.zip')); 
       success = true; 
      } 
      // If you want to set a timeout delay 
      // setTimeout(function() { callback(null) }, 3000); 
      callback(null); 
     }); 
    }, 
    // Success! 
    function(err) { 
     // Do anything after it's done 
    } 
) 

Вы можете сделать это с некоторыми другими способами, как в setInterval, но я бы выбрал использовать асинхронной для дружной асинхронной функциональности.

EDIT: Вот еще один пример использования setTimeout (я не хотел начальную задержку с setInterval

let request = require('request'); 

let check_loop =() => { 
    request('http://url-here.tld', (err, response, body) => { 
     // Edit line below to look for specific header and value 
     if(response.headers['{{HEADER_NAME_HERE}}'] == '{{EXPECTED_HEADER_VAL}}') 
     { 
      response.pipe(fs.createWriteStream('./filename.zip')); // write file to ./filename.zip 
     } 
     else 
     { 
      // Not ready yet, try again in 30s 
      setTimeout(check_loop, 30 * 1000); 
     } 
    }); 
}; 

check_loop(); 
+0

Я не могу показаться, чтобы получить ответ на работу, у вас есть пример использования. setInterval? – MindVox

+0

Я обновил свой ответ с помощью другого примера: он был быстрым и грязным, поэтому вам может понадобиться немного его подстроить. – Ding

+0

Спасибо за ответ, досадно, что ваши примеры не работают, потому что запросы просто повторяются, и сессия не поддерживается. Я не уверен, что мне нужно сделать дополнительную просьбу sts от первого. Или используйте поток для проверки заголовков, чтобы соединение поддерживалось. – MindVox

Смежные вопросы