我有一些問題使用Node.js作爲一個現有的長輪詢服務器的http客戶端。我使用'http'和'events'作爲要求。http.Clientrequest.abort()結束程序
我創建了一個包裝對象,其中包含處理http.clientrequest的邏輯。這是代碼的簡化版本。它完全按預期工作。當我調用EndMe時,它會按預期中止請求。
var http = require('http');
var events = require('events');
function lpTest(urlHost,urlPath){
this.options = {
host: urlHost,
port: 80,
path: urlPath,
method: 'GET'
};
var req = {};
events.EventEmitter.call(this);
}
lpTest.super_ = events.EventEmitter;
lpTest.prototype = Object.create(events.EventEmitter.prototype, {
constructor: {
value: lpTest,
enumerable: false
}
});
lpTest.prototype.getData = function getData(){
this.req = http.request(this.options, function(res){
var httpData = "";
res.on('data', function(chunk){
httpData += chunk;
});
res.on('end', function(){
this.emit('res_complete', httpData);
}
};
}
lpTest.prototype.EndMe = function EndMe(){
this.req.abort();
}
module.exports = lpTest;
現在我想創建一堆這些對象,並使用它們來長時間輪詢一堆URL。所以我創建一個對象來包含它們,分別生成每個對象,啓動它,然後將它存儲在我包含的對象中。這是一種享受,所有存儲的長輪詢對象觸發事件並按預期返回數據。
var lpObject = require('./lpTest.js');
var objWatchers = {};
function DoSomething(hostURL, hostPath){
var tempLP = new lpObject(hostURL,hostPath);
tempLP.on('res_complete', function(httpData){
console.log(httpData);
this.getData();
});
objWatchers[hosturl + hostPath] = tempLP;
}
DoSomething('firsturl.com','firstpath');
DoSomething('secondurl.com','secondpath);
objWatchers['firsturl.com' + 'firstpath'].getData();
objWatchers['secondurl.com' + 'secondpath'].getData();
現在這裏是它失敗的地方......我希望能夠停止一個長輪詢對象,同時讓剩下的事情繼續下去。所以很自然我嘗試添加:
objWatchers['firsturl.com' + 'firstpath'].EndMe();
但是,這將導致整個節點的執行停止,回到我的命令行。所有剩下的長期投票對象,都很高興地做着他們應該做的事情,突然停止。
任何想法?
此代碼中存在相當多的語法錯誤,這使得它更難以測試。你可以更新這個修復缺少的需求,括號,並添加兩個實際用於測試的網址嗎? – geoffreak
我已經推薦了代碼。對不起,這是我工作的內部系統,所以我無法提供一個工作系統來測試。 hostURL採用IP地址的形式,hostPath是特定的長輪詢資源。 –