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

看板Ajax作者 (未來的方向)時間11年前 (2014/11/04 21:18), 編輯推噓0(004)
留言4則, 1人參與, 最新討論串1/2 (看更多)
各位先進大家好, 抱歉標題下的可能不太好,(不知道怎麼描述比較好...) 我的現在想要利用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(); }; -- -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.231.13.210 ※ 文章網址: http://www.ptt.cc/bbs/Ajax/M.1415107085.A.293.html

11/05 01:13, , 1F
你沒發現,每跑一次,event上的listener就多了一個嗎?
11/05 01:13, 1F

11/05 01:14, , 2F
而且,全部request共用一個channal會有問題吧?
11/05 01:14, 2F

11/05 01:15, , 3F
這樣哪知道request是哪個client要的?
11/05 01:15, 3F

11/05 01:17, , 4F
nodejs是single instance的語言歐?用php的做法穩炸掉
11/05 01:17, 4F
文章代碼(AID): #1KMD8DAJ (Ajax)
文章代碼(AID): #1KMD8DAJ (Ajax)