用node做一个http代理服务器的问题
发布于 11 年前 作者 DysonL 22901 次浏览 最后一次编辑是 8 年前

我做的这台代理服务器作为网关,把来自公网客户端的请求通过http转发到内部的连天服务器,但在开发阶段由于客户端发送带未转义的双引号,换行符等字符,导致聊天服务器解析json数据包出错,从而未响应我的网关服务器。

我于是设置了请求超时,和错误事件处理,以结束客户端的请求。但即使这样,node写的网关服务器还是经常被挂起,即进程和端口一直在,但就是不能再响应来自客户端的请求了,最后返回server no reult。初次使用nodejs写,没有系统学习过,请大神帮忙看看我这代码有啥问题。

<pre class=“prettyprint language-javascript”> <code> process.on(‘uncaughtException’, function (err) { console.log('Caught exception: ’ + err); });

var config=require(’./config.json’); if(config){ for(var k in config){ console.log(k+’:’+config[k]); } } var LOCAL_PORT = config.localPort || 1337; var REMOTE_PORT = config.mailchatServerPort || 7777; var REMOTE_ADDR = config.mailchatServer || ‘10.25.2.17’;

var log4js = require(‘log4js’); log4js.configure({ appenders: [ { type: ‘console’ }, //{ type: ‘file’, filename: ‘logs/cheese.log’, category: ‘cheese’ }, { type: ‘dateFile’, filename: ‘info.log’, pattern: ‘-yyyy-MM-dd’, alwaysIncludePattern: false, category: ‘dateFileLog’ } ], replaceConsole:true, levels:{ dateFileLog: ‘INFO’ } });

var log = log4js.getLogger(‘dateFileLog’);

http = require(‘http’); http.createServer(onRequest).listen(LOCAL_PORT); log.info('Gateway Server listen at ’ + LOCAL_PORT + ‘.’);

function onRequest(client_req, client_res) { if(client_req.url.indexOf(’/favicon.ico’)==0) return; log.info(‘Request URL: ’ + client_req.url); log.info(‘Request Header: ’ + JSON.stringify(client_req.headers)); var options = { hostname: REMOTE_ADDR, port: REMOTE_PORT, path: client_req.url, method: client_req.method, headers: client_req.headers }; client_res.setHeader(‘Content-type’,‘application/json’); client_res.setHeader(‘Access-Control-Allow-Origin’,’*’); var proxy = http.request(options, function (res) { log.info('From ChatServer STATUS: ’ + res.statusCode); log.info('From ChatServer HEADERS: ’ + JSON.stringify(res.headers)); res.setEncoding(‘UTF8’); res.pipe(client_res, { end: true }); });

proxy.on(‘error’, function(e) { log.info('Problem with request from ChatServer: ’ + e.message); client_res.statusCode=500; client_res.end(); //client_res.end('cache server error: '+e.message); });

proxy.setTimeout(10*1000, function(){ log.info(‘Request Timeout From ChatServer in 10 seconds, then response code 500’); client_res.statusCode=500; client_res.end(); //client_res.end(‘Reuqest Timeout’); });

client_req.setTimeout(10*1000, function(){ log.info(‘Timeout’); client_res.statusCode=500; client_res.end(); });

client_req.pipe(proxy, { end: true });

} </code> </pre>

5 回复

干嘛自己写,用这个https://github.com/nodejitsu/node-http-proxy

nodejitsu官方用的。自己写太麻烦了

好长,不看了。 不要用node做代理,用nginx。 node毕竟是js写逻辑,不如nginx的c语言更底层,而且很现成方便的东西,不用岂不是很可惜。 而且两个小时你就可以学会并搭建一个nginx代理服务器。

另外,即便node做服务器,要有一个文件专门写好路由映射规则,逻辑细节和规则分开会比较容易调试。

var proxy = function () { //封装异步请求,其余的你自己改试试,主要问题应该是没处理好node.js 的异步问题,好久没做Node.js开台开发,最近在研究JS本身。 http.request(options, function (res) { log.info('From ChatServer STATUS: ’ + res.statusCode); log.info('From ChatServer HEADERS: ’ + JSON.stringify(res.headers)); res.pipe(client_res, { end: true }); }); }; client_req.on(‘end’, proxy); 建议用责任链模式来设计,维护起来更方便 .

80行代码。。。。,关于用javascript 写逻辑,用高阶函数写逻辑还是挺爽的,没什么不好。

@hackerjs 最大的问题就是性能,javascript 与 c不在一个量级

回到顶部