2013-02-27 32 views
6

मैं नोड-http-प्रॉक्सी को रिवर्स प्रॉक्सी के रूप में उपयोग करने का प्रयास कर रहा हूं, लेकिन मुझे काम करने के लिए POST और PUT अनुरोध नहीं मिल रहे हैं। फ़ाइल server1.js रिवर्स प्रॉक्सी है (कम से कम url "/ forward-this" के अनुरोध के लिए) और server2.js वह सर्वर है जो प्रॉक्सी अनुरोध प्राप्त करता है। कृपया बताएं कि मैं गलत तरीके से क्या कर रहा हूं।प्रॉक्सी क्लाइंट पोस्ट और PUT अनुरोधों को रिवर्स कैसे करें node-http-proxy

यहाँ server1.js के लिए कोड है:

// File: server1.js 
// 

var http = require('http'); 
var httpProxy = require('http-proxy'); 

httpProxy.createServer(function (req, res, proxy) { 
    if (req.method == 'POST' || req.method == 'PUT') { 
     req.body = ''; 

     req.addListener('data', function(chunk) { 
      req.body += chunk; 
     }); 

     req.addListener('end', function() { 
      processRequest(req, res, proxy); 
     }); 
    } else { 
     processRequest(req, res, proxy); 
    } 

}).listen(8080); 

function processRequest(req, res, proxy) { 

    if (req.url == '/forward-this') { 
     console.log(req.method + ": " + req.url + "=> I'm going to forward this."); 

     proxy.proxyRequest(req, res, { 
      host: 'localhost', 
      port: 8855 
     }); 
    } else { 
     console.log(req.method + ": " + req.url + "=> I'm handling this."); 

     res.writeHead(200, { "Content-Type": "text/plain" }); 
     res.write("Server #1 responding to " + req.method + ": " + req.url + "\n"); 
     res.end(); 
    } 
} 

और यहाँ server2.js के लिए कोड है:

// File: server2.js 
// 

var http = require('http'); 

http.createServer(function (req, res, proxy) { 
    if (req.method == 'POST' || req.method == 'PUT') { 
     req.body = ''; 

     req.addListener('data', function(chunk) { 
      req.body += chunk; 
     }); 

     req.addListener('end', function() { 
      processRequest(req, res); 
     }); 
    } else { 
     processRequest(req, res); 
    } 

}).listen(8855); 

function processRequest(req, res) { 
    console.log(req.method + ": " + req.url + "=> I'm handling this."); 

    res.writeHead(200, { 'Content-Type': 'text/plain' }); 
    res.write("Server #2 responding to " + req.method + ': url=' + req.url + '\n'); 
    res.end(); 
} 

उत्तर

4

http-प्रॉक्सी पोस्ट/PUT अनुरोध के लिए data और end घटनाओं पर निर्भर करता है । उस समय के बीच विलंबता जब सर्वर 1 अनुरोध प्राप्त करता है और जब यह प्रॉक्सी हो जाता है तो इसका अर्थ है कि http-proxy उन घटनाओं को पूरी तरह से याद करता है। इसे सही तरीके से काम करने के लिए आपके पास दो विकल्प हैं - आप buffer the request कर सकते हैं या आप इसके बजाय routing proxy का उपयोग कर सकते हैं। रूटिंग प्रॉक्सी यहां सबसे उपयुक्त लगता है क्योंकि आपको केवल अनुरोधों का सबसेट प्रॉक्सी करने की आवश्यकता है। यहाँ संशोधित server1.js है:

// File: server1.js 
// 

var http = require('http'); 
var httpProxy = require('http-proxy'); 
var proxy = new httpProxy.RoutingProxy(); 

http.createServer(function (req, res) { 
    if (req.url == '/forward-this') { 
     return proxy.proxyRequest(req, res, { 
      host: 'localhost', 
      port: 8855 
     }); 
    } 

    if (req.method == 'POST' || req.method == 'PUT') { 
     req.body = ''; 

     req.addListener('data', function(chunk) { 
      req.body += chunk; 
     }); 

     req.addListener('end', function() { 
      processRequest(req, res); 
     }); 
    } else { 
     processRequest(req, res); 
    } 

}).listen(8080); 

function processRequest(req, res) { 
    console.log(req.method + ": " + req.url + "=> I'm handling this."); 

    res.writeHead(200, { "Content-Type": "text/plain" }); 
    res.write("Server #1 responding to " + req.method + ": " + req.url + "\n"); 
    res.end(); 
} 
+0

यह पूरी तरह से काम किया। धन्यवाद! –

+0

हालांकि, यह एक पुराना उत्तर है, इसे काम करने के लिए आपको 'var proxy = new httpProxy.RoutingProxy(); ' ' var proxy = httpProxy.createProxyServer ({}) के साथ प्रतिस्थापित करना चाहिए;' – Saber

2
@squamos

How to write a node express app that serves most local files, but reroutes some to another domain?

var proxy = new httpProxy.RoutingProxy(); 

करने के लिए

इसके अलावा "से ऊपर कोड http-प्रॉक्सी ~ 0.10.x के लिए काम कर रहा है तो चीजों की बहुत बाद से। लाइब्रेरी में बदल गया था। नीचे आप नए संस्करण के लिए उदाहरण पा सकते हैं (लिखने के समय ~ 1.0.2) "

var proxy = httpProxy.createProxyServer({}); 
1

प्रॉक्सीइंग POST अनुरोधों के लिए मेरा समाधान यहां है। यह सबसे आदर्श समाधान नहीं है, लेकिन यह काम करता है और समझने में आसान है।

var request = require('request'); 

var http = require('http'), 
    httpProxy = require('http-proxy'), 
    proxy = httpProxy.createProxyServer({}); 

http.createServer(function(req, res) { 
    if (req.method == 'POST') { 
     request.post('http://localhost:10500/MyPostRoute', 
        {form: {}}, 
        function(err, response, body) { 
         if (! err && res.statusCode == 200) { 
          // Notice I use "res" not "response" for returning response 
          res.writeHead(200, {'Content-Type': "application/json"}); 
          res.end(body); 
         } 
         else { 
          res.writeHead(404, {'Content-Type': "application/json"}); 
          res.end(JSON.stringify({'Error': err})); 
         } 
        }); 
    } 
    else if (req.method == 'GET') { 
     proxy.web(req, res, { target: 'http://localhost/9000' }, function(err) { 
      console.log(err) 
     }); 
    } 

बंदरगाहों 10500 और 9000 ऐच्छिक हैं और मेरी कोड में मैं गतिशील सेवाओं मैं मेजबान के आधार पर उन्हें आवंटित। यह PUT से निपटता नहीं है और यह कम कुशल हो सकता है क्योंकि मैं वर्तमान में हेरफेर करने की बजाय एक और प्रतिक्रिया बना रहा हूं।

संबंधित मुद्दे