不会的要多查多问,不然不会的永远不会,哪怕你离会就差了那么一点点
NodeJS反向代理至后端数据接口
[ 2016/09/21 12:36 | by 刘新修 ]
支持来自任何域名的Post请求,验证请求参数必须有: [name、gender] 否则直接JSON返回错误!
JavaScript代码
- var http=require('http');
- function server(){
- this.exec=function(route,req,res){
- var _self=this;
- /********** 获取客户端数组中的部分数据可向后多取 **********/
- this.arrv=function(o,n,p){
- var i,y,d,p;y=false;d='';
- for(i in o){
- if(o[i]==n&&p==undefined){i++;return o[i]};
- if(o[i]==n&&p!=undefined&&!isNaN(p)||y){
- var s;s=i;
- p=Number(p);
- if(p>0){
- p--;s++;d+=o[s];y=true;
- }
- else{
- return d;
- }
- }
- }
- };
- /********** 请求后端时可获取单个header头内地信息 **********/
- this.getReqHeaders=function(n){
- if(typeof(n)=='undefined'){
- console.log('getReqHeaders(n)变量没有定义!');
- }else{
- return _self.arrv(req.rawHeaders,String(n));
- }
- };
- /******** 获取客户端请求的header整体头部信息 ********/
- this.rawHeaders=function(state){
- var json={};
- if(!state){
- for(var i=0;i<req.rawHeaders.length;i++){
- var s,s=i;
- if(i%2==0){
- s++;json[req.rawHeaders[i]]=req.rawHeaders[s];
- }
- }
- }
- if(state){
- for(var i=0;i<req.rawHeaders.length;i++){
- json[i]=req.rawHeaders[i];
- }
- }
- var jsonStr=JSON.stringify(json);//结果:"{'1':'a','2':'b','3':'c'}"
- var jsonObj=JSON.parse(jsonStr); //结果:[object Object]
- return jsonObj;
- };
- //接收参数 ------ sreq.on("data",function(data){});接收html中ajax传递的参数
- req.on("data",function(data){
- /********* 打印提示||接受数据并反向代理到后端 *********/
- console.log("\n--->>\nReq.on('data')",req.method.toUpperCase()+" Use Proxy!");
- /********* 使用代理||这里Post请求体是回调data *********/
- send(route,req,res,data);
- });
- /********** 判断是GET请求类型||也可以代理给后端处理 **********/
- if(req.method.toUpperCase()=="GET"){
- var params=[];
- //params=url.parse(request.url,true).query;
- //params['fruit']=compute(params);
- res.writeHeader(200,{
- "Content-type":"text/html; charset=utf-8"
- });
- res.write('<h1>It is forbidden for the URL request!</h1>');
- res.write('<hr><address>NodeJs/'+process.version);
- res.write(' at '+req.headers.host.split(':')[0]);
- res.write(' Port '+req.headers.host.split(':')[1]+'</address>');
- res.end();
- }
- /********* 如有req.on("data",function(data){});就跳过了以下方法 ******/
- /********* 判断是POST请求类型||提交不走代理此方法是本机处理回调 **********/
- else if(req.method.toUpperCase()=='POSTo'){
- var postData="";
- /********** 读取Post提交的数据 **********/
- req.addListener("data",function(data){
- postData+=data;
- });
- /********** 数据读取完毕就会执行的监听 *********/
- req.addListener("end",function(){
- /********* 定义Post请求主体 *********/
- var query=require('querystring').parse(postData);
- /************** 判断如果有POST过来数据 *************/
- if(query.name&&query.gender){
- console.log('Start a request...');
- var origin=_self.arrv(req.rawHeaders,'Origin');
- console.log("origin:"+typeof req.rawHeaders+'---')
- /********** 代理转发至php,跨域全放开让后端去匹配验证 **********/
- //res.setHeader('Access-Control-Allow-Origin','*');
- //res.setHeader('Access-Control-Allow-Headers','X-Requested-With');
- //res.setHeader('Access-Control-Allow-Methods','GET,POST,PUT,DELETE,OPTIONS');
- //send(route,req,res,query);
- }
- /****** 判断结束 ******/
- });
- }
- /******** 请求后端接口 ********/
- function send(route,req,res,data){
- /***************************************
- var data={
- name:'liuxinxiu',
- gender:"male",
- time:new Date().getTime()
- };
- ****************************************/
- //data=require('querystring').stringify(data);
- var rawHeaders=_self.rawHeaders();
- /********** 判断一个对象是哪中类型的对象 **********/
- function isArray(obj){
- return Object.prototype.toString.call(obj)==='[object Array]';
- };
- /********* 打印Request Headers **********/
- console.log("\n--->>\nRequest Headers:",req.rawHeaders);
- /***** 向后端发送请求基本的设置 *****/
- var options={
- port: 80,
- host:"code.liuxinxiu.com",
- path:'/php/Post/CORS_PHP.php',
- method: 'POST',
- headers:{
- 'Content-Type':_self.getReqHeaders('Content-Type'),
- 'Content-Length':data.length,
- 'Origin':_self.getReqHeaders('Origin'),
- 'User-Agent':_self.getReqHeaders('User-Agent')
- }
- };
- /***** 如果header整体替换就会乱码 *****/
- //options.headers=_self.rawHeaders();
- var request=http.request(options,function(result){
- console.log("\n--->>\nstatusCode:",result.statusCode);
- console.log("\n--->>\nResponse Headers:",result.headers);
- if(result){
- var content_type,origin,x_powered_by,server;
- //content_type=origin=x_powered_by=server=undefined;
- content_type=result.headers['content-type'];
- origin=result.headers['access-control-allow-origin'];
- x_powered_by=result.headers['x-powered-by'];
- server=result.headers['server'];
- /********** 判断分别加入包含服务器错误页 **********/
- if(origin!=undefined&&result.statusCode==200){
- res.setHeader('Access-Control-Allow-Origin',origin);
- }
- if(content_type!=undefined){
- res.setHeader('Content-Type',content_type);
- }
- if(x_powered_by!=undefined){
- res.setHeader('X-Powered-By',x_powered_by);
- }
- if(server!=undefined){
- res.setHeader('Server',server);
- }
- }
- /********** 有异常的请求需要问题定位 **********/
- if(result.statusCode<200||result.statusCode>206){
- }
- /********** 接受数据数据监听 **********/
- var _data='';
- result.on('data',function(chunk){
- _data+=chunk;
- });
- /********** 结束接受数据监听 *********/
- result.on('end',function(){
- console.log("\n--->>\nresult:",_data);
- res.write(_data);
- res.end();
- });
- /******** request逻辑完成 ********/
- });
- request.on('error',function(e) {
- console.log('problem with request: ' + e.message);
- });
- //request.write(data);
- request.write(data+"\n");
- request.end();
- }
- /****** 内部结束 ******/
- }
- }
- module.exports=new server();
NodeJS数据接口(Post请求直接代理至后端PHP): http://liuxinxiu.com:3000/CORS_Node_Proxy/
PHP数据接口(验证跨域提交白名单外返回错误): http://code.liuxinxiu.com/php/Post/CORS_PHP.php