2017-02-09 5 views
0

Мне нужен «вечно-сторожевой таймер» для проверки того, доступен ли URL-адрес или нет. Мое дело в том, что я должен посмотреть, подключен ли медиа-поток, и если мне нужно будет запустить shell-скрипт. Если он не достигнут (404'd), я бы попытался снова за x секунд.nodejs: проверить, пока URL-адрес не будет получен в сети.

Может ли кто-нибудь направить меня в правильном направлении, с точки зрения модулей или течения? У меня были проблемы с разрешением адресата с помощью

isReachable = require('is-reachable'); 

модуль.

Спасибо за помощь!

ответ

0

Вы можете отправлять запросы по URL повторно. Что-то вроде этого:

//I don't know how you create nodejs server, I just leave out that part. 
//I use request module. sudo npm install --save request 
var request = require('request'); 
var URL = 'https://www.google.com'; 
var X = 5000; //5 seconds 
var sendRequest = function(){ 
    request(URL, function(error, response, body){ 
    if(response.statusCode === 200){//If good 
     runScript(); //This is the function you write to run sh 
    } 
    setTimetout(sendRequest, X);//run the function again no matter what 
    });  
} 
sendRequest(); 

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

var rp = require('request-promise'); 
var options = { 
    uri : 'https://www.google.com', 
    json : true 
}; 
var X = 5000; //5 seconds, the actual time is 5 seconds plus the time to resolve 
var sendRequest_promise = function(){ 
    //return a request promise 
    return rp(options).then(function(response){ 
    return response; 
    }); 
}; 
var sendRequest = function(){ 
    sendRequest_promise().then(function(response){ 
    if(response.statusCode === 200){ 
     runScript(); 
    } 
    setTimeout(sendRequest(), X); 
    }); 
}; 
+0

Большого спасибо! Как сделать это циклом forever, который проверяется каждые 5 секунд, если он (все еще) жив? –

+0

С 'X = 30' это будет проверяться каждые 30 миллисекунд, а не 30 секунд. установите 'X = 30000' каждые 30 секунд. – Bradley

+0

@ Брэдли, ты прав. – Jaaaaaaay

0

Попробуйте это, должен решить, вы поручаете

'use strict'; 
 
const co = require('co'); 
 
const request = require('request'); 
 
const exec = require('child_process').exec; 
 

 
let getRemoteSourceStatusPromise = function(urlForCheck){ 
 
    return new Promise(function (resolve, reject) { 
 
     request(urlForCheck, function(error, response){ 
 
      console.log('send request...'); 
 
      if(error) 
 
       return reject(error); 
 

 
      let result = false; 
 
      console.log('Resource response statusCode ' + response.statusCode); 
 
      if(200 === response.statusCode){ 
 
      result = true; 
 
      } 
 
      return resolve(result); 
 
     }); 
 
    }); 
 
}; 
 
let callShScriptPromise = function(){ 
 
    let shScriptPath = './script.sh'; 
 
    return new Promise(function (resolve, reject) { 
 
     console.log('Calling sh...'); 
 
     exec(shScriptPath, 
 
      function (error) { 
 
       if (error) 
 
        return reject(error); 
 
       resolve(true); 
 
      }); 
 
    }); 
 
}; 
 
let sleep = function (sleepInterval) { 
 
    return new Promise(function (resolve) { 
 
     setTimeout(function() { 
 
      console.log('sleep...'); 
 
      resolve(); 
 
     }, sleepInterval); 
 
    }); 
 
}; 
 
let loopGenerator = function* (urlForCheck, sleepInterval){ 
 
    let bShScriptStarted = false; 
 
    while(true){ 
 
     let bSourceStatus = yield getRemoteSourceStatusPromise(urlForCheck); 
 
     if(bSourceStatus === true){ 
 
      if(!bShScriptStarted) 
 
       bShScriptStarted = yield callShScriptPromise(); 
 
     }else{ 
 
      bShScriptStarted = false; 
 
     } 
 
     yield sleep(sleepInterval); 
 
    } 
 
}; 
 

 

 
//Starting loop 
 
co(loopGenerator('http://google.com', 30000)) 
 
    .catch(function (error) { 
 
     console.log(error); 
 
    })

+0

Функция генератора имеет бесконечный цикл с обещаниями вызова (для получения статуса совпадения, очистки и вызова сценария bash). «Co» используется для запуска генератора. –

+0

. Вы можете установить 5000 вместо 30000. И скрипт будет проверять статус каждые 5 секунд (и при необходимости запускается, если это необходимо) –

+0

Спасибо! Это дало мне кучу проблем, хотя, например, сообщения об ошибках для let, const, yield, 'function *' и т. Д. Я что-то пропустил? –

0
const rp = require('request-promise'); 

const checkIfOnline = (() -> { 
    return new Promise((resolve, reject)=>{ 
     rp(url).then(response => { 
      // this is where you run your script 
      resolve(); 
     }).catch(error=>{ 
      setTimeout(resolve(checkIfOnline()), 5000); 
     }); 
    }); 
})();