[问题] 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