我需要一个“永远看门狗”来检查URL是否可到达。我的情况是,我必须查看媒体流是否上线,如果我需要运行shell脚本。如果无法访问(404'd),我会在x秒内再次尝试。nodejs:检查直到URL获得在线
任何人都可以引导我进入正确的方向,在模块方面,或流动?我在解决目标问题时遇到了问题,即使用
isReachable = require('is-reachable');
模块。
感谢您的帮助!
我需要一个“永远看门狗”来检查URL是否可到达。我的情况是,我必须查看媒体流是否上线,如果我需要运行shell脚本。如果无法访问(404'd),我会在x秒内再次尝试。nodejs:检查直到URL获得在线
任何人都可以引导我进入正确的方向,在模块方面,或流动?我在解决目标问题时遇到了问题,即使用
isReachable = require('is-reachable');
模块。
感谢您的帮助!
您可以重复向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);
});
};
试试这个,应该可以解决你任务
'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);
})
生成器函数具有调用承诺的infinit循环(用于获取sorce状态,sleaping和调用bash脚本)。 “Co”用于启动发生器 –
您可以将5000设置为30000.脚本会每5秒检查一次状态(如果需要,将启动sh) –
谢谢!这给了我很多问题,比如let,const,yield,'function *'等错误信息。我是否错过了一些东西? –
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);
});
});
})();
非常感谢您!我如何使它成为一个永久循环,每5秒检查它是否仍然活着? –
使用'X = 30'时,将每30毫秒检查一次,而不是30秒。每30秒设置一次'X = 30000'。 – Bradley
@Bradley是的,你是对的。 – Jaaaaaaay