2014-03-13 41 views
3

後停止我的服務器上,將等待10秒鐘,說Hello以下PHP腳本:節點http.request,沒有活動事件的觸發,如果互聯網發送請求

<php sleep(10); ?>Hello 

在客戶端(節點),我有以下幾點:

var http = require('http'); 
http.get ('http://example.com/sleep.php', function (resp) { 
    resp.on('data', function (d) { 
     console.log ('data!', d.toString()); 
    }); 
    resp.on('end', function (d) { 
     console.log ('Finished!'); 
    }); 
}).on('error', function (e) { 
    console.log ('error:', e); 
}); 

的問題是,如果要求在互聯網連接停止,也不會觸發errorend事件。

要重新產生問題:

  • 某處的PHP腳本互聯網
  • 上運行節點腳本
  • 斷開互聯網
  • 腳本不執行任何

我也發現如果連接在10秒內回來,它仍然可以收到消息。

所以,我做了一個簡單的間隔循環來檢查狀態。但是,如果連接已停止工作或仍在等待響應它無法檢測:

var http = require('http'); 
var lastRespond = 0, intervalCheck; 
var respFinished = false; 
http.get ('http://jixun.no-ip.org/sleep.php', function (resp) { 
    resp.on('data', function (d) { 
     lastRespond = new Date; 
     console.log ('data!', d.toString()); 
    }); 
    resp.on('end', function (d) { 
     respFinished = true; 
     console.log ('Finished!'); 
    }); 
}).on('error', function (e) { 
    console.log ('error:', e); 
}); 
intervalCheck = setInterval(function() { 
    if (respFinished) { 
     clearInterval(intervalCheck); 
    } else if (new Date - lastRespond >= 120000) { 
     console.log ('Timeout :('); 
     clearInterval(intervalCheck); 
    } 
}, 120000); // 2 mins. 

所以我的問題是:有沒有什麼辦法來檢查插座關閉/連接發送的請求後停止? 在此先感謝。

+0

要重現,您還可以開始下載文件並拉動以太網電纜。我有同樣的問題。 – DrakaSAN

回答

2

對實際請求使用setTimeout可以解決您的問題。那麼,這不是像'close','end'和'error'這樣的實際事件。下面的示例確實重現並解決了該問題,但在另一個上下文中未嘗試過。

var http = require('http'); 
http.get ('http://fake-response.appspot.com?sleep=5', function (resp) { 
    resp.on('data', function (d) { 
    console.log ('data!', d.toString()); 
    }); 
    resp.on('end', function (d) { 
    console.log ('Finished!'); 
    }); 
}).on('error', function (e) { 
    console.log ('error:', e); 
}).setTimeout(12000, function () { 
    console.log('Timeout reached...'); 
    process.exit(1); 
});   

更多信息可以在documentation找到。無論是使用它還是在'關閉'事件上收聽,這與網絡模塊都能很好地協作。

+1

純粹的節點和便攜式解決方案,沒有真正深入到文檔...感謝^^ – Jixun

1

也許這會爲你是有用的:

創建一個bash腳本,檢查連接(從https://stackoverflow.com/a/14939373/1779015抓起很少修改):

#!/bin/bash 

    # Test for network conection 
    for interface in $(ls /sys/class/net/ | grep -v lo); 
    do 
     if [[ $(cat /sys/class/net/$interface/carrier 2> /dev/null) = 1 ]]; then OnLine=1; fi 
    done 
    if ! [ $OnLine ]; then echo "0"; 
    else 
     echo "1"; 
    fi 

然後從節點腳本中調用它,閱讀標準輸出,爲帶有child_process的示例(http://nodejs.org/api/child_process.html):

var spawn = require('child_process').spawn, 
    hasInet = spawn('./test-inet.sh'); 

hasInet.stdout.pipe(process.stdout); 
相關問題