2017-02-09 47 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

非常感谢您!我如何使它成为一个永久循环,每5秒检查它是否仍然活着? –

+0

使用'X = 30'时,将每30毫秒检查一次,而不是30秒。每30秒设置一次'X = 30000'。 – Bradley

+0

@Bradley是的,你是对的。 – 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

生成器函数具有调用承诺的infinit循环(用于获取sorce状态,sleaping和调用bash脚本)。 “Co”用于启动发生器 –

+0

您可以将5000设置为30000.脚本会每5秒检查一次状态(如果需要,将启动sh) –

+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); 
     }); 
    }); 
})();