[問題] node.js回傳response的問題(http)

作者: akdsy (未來的方向)   2014-11-04 21:18:02
各位先進大家好,
抱歉標題下的可能不太好,(不知道怎麼描述比較好...)
我的現在想要利用node.js做為server端語言做到以下
1.接收用戶的 http request(單元測試OK)
2.分析 method post的參數資料(單元測試OK)
3.承2,將資料送往其他web service(假設此service叫做 service1 好了,單元測試OK)
4.接收service1 回傳的資料再送給用戶(單元測試OK)
但是當我打算把以上4個過程都組合一起的時候,
因為node.js是以event driven的方式處理,
所以就會有點流程上連貫不起來的問題@@ ...抱歉我還不是很熟練這樣的開發方式
主要是當送出資料給其他web service的時候,(呼叫httprequestToOtherServer method)
就不會回來原來的流程,
所以我的作法是就在原本的webservice,建立一個event,
當httprequestToOtherServer這個method向service1 取得資料後,
就會呼叫這個event(定義為GetReturnData),將結果回傳給用戶。
基本上這個流程有取回資料沒錯,
可是不知為何,
當我多重複送幾次資料,
事件GetReturnData卻會被重複的觸發,
送第一次要求 ->觸發1次
再送一次要求 ->觸發2次
再送一次要求 ->觸發3次...
不知道什麼地方寫得不好,
或是有更好的開發此web Service方式??
麻煩各位先進指導一下,
感謝
以下是部分的code,
var event = require( './modules/event' );
var http = require('http');
var url = require('url');
var querystring = require("querystring");
var BASE_URL = "測試用IP";
// Configure our HTTP server to respond with Hello World to all requests.
function WebService(){
var server = http.createServer(function (request, response) {
var inputPath= request.url;
var queryData = url.parse(inputPath, true).query;
var path = url.parse(inputPath, true).pathname;
var postData = "";//post 取得的資料
var username="";
var email="";
//自訂event作為回傳訊息使用
event.on( 'GetReturnData', function(arg1){
console.log("arg1= "+arg1);
response.writeHead(200, {"Content-Type": "text/plain"});
response.end(arg1);
});
if(path=="/Sign"){
if(request.method=="POST"){
//逐步取得資料
request.setEncoding("utf-8");
request.addListener("data", function (postDataChunk) {
postData += postDataChunk;
});
//取得所有的資料
request.addListener("end", function () {
//解析取得資料
var objectPostData = querystring.parse(postData);
//產生另外一個http呼叫
httprequestToOtherServer("123");
});
}else{
response.end("NO DEFINE METHOD");
}
}
}).listen(8888,BASE_URL);
}
//啟動web service
WebService();
//另外一個web service
var httprequestToOtherServer = function(parameter){
var data = querystring.stringify({
t1:parameter,
});
var options = {
host: 另一個web service的IP,
port: 80,
path: '/test',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': Buffer.byteLength(data)
}
};
var req = http.request(options, function(res) {
res.setEncoding('utf8');
//取得另一個WEB SERVICE的回傳值
res.on('data', function (chunk) {
//觸發自訂回傳事件
console.log("處發事件GetReturn");
if(!event.emit('GetReturnData',chunk)){
console.log("觸發GetReturnData失敗");
}
});
});
req.on('error', function(e) {
console.log('problem with request: ' + e.message);
});
req.write(data);
req.end();
};
作者: mmis1000 (秋月戀楓)   2014-11-05 01:13:00
你沒發現,每跑一次,event上的listener就多了一個嗎?而且,全部request共用一個channal會有問題吧?這樣哪知道request是哪個client要的?nodejs是single instance的語言歐?用php的做法穩炸掉

Links booklink

Contact Us: admin [ a t ] ucptt.com