2011-09-26 20 views
22

का उपयोग करके कोई प्रतिक्रिया नहीं मैंने नोडजेस, एक्सप्रेस और प्रेजेंट-प्रॉक्सी के साथ एक छोटी प्रॉक्सी लिखी है। यह स्थानीय फ़ाइलों की सेवा के लिए अच्छी तरह से काम करता है लेकिन विफल रहता है, जब यह बाहरी api के लिए प्रॉक्सी की बात आती है:एक्सप्रेस प्रॉक्सी मार्ग

var express = require('express'), 
    app = express.createServer(), 
    httpProxy = require('http-proxy'); 


app.use(express.bodyParser()); 
app.listen(process.env.PORT || 1235); 

var proxy = new httpProxy.RoutingProxy(); 

app.get('/', function(req, res) { 
    res.sendfile(__dirname + '/index.html'); 
}); 
app.get('/js/*', function(req, res) { 
    res.sendfile(__dirname + req.url); 
}); 
app.get('/css/*', function(req, res) { 
    res.sendfile(__dirname + req.url); 
}); 

app.all('/*', function(req, res) { 
    req.url = 'v1/public/yql?q=show%20tables&format=json&callback='; 
    proxy.proxyRequest(req, res, { 
     host: 'query.yahooapis.com', //yahoo is just an example to verify its not the apis fault 
     port: 8080 
    }); 

}); 

समस्या याहू एपीआई से कोई जवाब नहीं है, शायद वहाँ एक प्रतिक्रिया है है कि वहाँ है, लेकिन मैं न में आया ब्राउज़र।

उत्तर

92

भी pipe और request -Package

var request = require('request'); 

app.use('/api', function(req, res) { 
    var url = apiUrl + req.url; 
    req.pipe(request(url)).pipe(res); 
}); 

यह पाइप एपीआई और पाइप प्रतिक्रिया वापस अनुरोधकर्ता को करने के लिए पूरे अनुरोध के साथ सरल: restler का उपयोग करते हुए जो मैं चाहता है। यह भी पोस्ट/PUT/हटाएँ और अन्य सभी अनुरोधों को प्रबंधित \ o/

आप भी क्वेरी स्ट्रिंग आप पाइप चाहिए के बारे में परवाह अगर यह रूप में अच्छी तरह

req.pipe(request({ qs:req.query, uri: url })).pipe(res); 
+0

किसी भी मौके पर आप समझा सकते हैं कि 'req.pipe (अनुरोध (url)) में क्या होता है। पाइप (res); '? दो पाइप की आवश्यकता क्यों है? – Jonathan

+3

'पाइप' लाइन लटकती है जब अनुरोधों में जेसन सामग्री-प्रकार होता है - देखें [यह प्रश्न] (http://stackoverflow.com/questions/26121830/proxy-json-requests-with-node-express) – Jonathan

+0

क्यों उपयोग नहीं करें 'अनुरोध (यूआरएल)। पाइप (आरएस);' जैसा कि [यहां सुझाया गया है] (http://stackoverflow.com/a/16924410/348545) – Jonathan

7

हो सकता है कि अपने कोड अलग है जब आप परीक्षण कर रहे हैं, लेकिन मैं का उपयोग कर अपने कोड नमूने में के रूप में उसी यूआरएल से क्वेरी कर रहा हूँ निम्नलिखित:

http://query.yahooapis.com:8080/v1/public/yql?q=show%20tables&format=json&callback=

और मैं वापस कुछ भी नहीं मिलता है। मेरा अनुमान है कि आप 80 (8080 से) के लिए पोर्ट बदलना चाहते है - यह काम करता है जब मैं इसे इतना की तरह बदलने के लिए:

http://query.yahooapis.com:80/v1/public/yql?q=show%20tables&format=json&callback=

तो मतलब है कि यह होना चाहिए:

proxy.proxyRequest(req, res, { 
    host: 'query.yahooapis.com', //yahoo is just an example to verify its not the apis fault 
    port: 80 
}); 
+0

ठीक है, बंदरगाह बदलते अपने प्रोजेक्ट के लिए भी काम करता है लेकिन दुर्भाग्य से मुझे सर्वर से 404 मिल गया है। ब्राउज़र में उसी यूआरएल को कॉल करना जो यह काम करता है। –

4

शायद मैं गलत तरीके से http-proxy का उपयोग करें।

var express = require('express'), 
    app = express.createServer(), 
    restler = require('restler'); 


app.use(express.bodyParser()); 
app.listen(1234); 



app.get('/', function(req, res) { 
    console.log(__dirname + '/index.html') 
    res.sendfile(__dirname + '/index.html'); 
}); 
app.get('/js/*', function(req, res) { 
    res.sendfile(__dirname + req.url); 
}); 
app.get('/css/*', function(req, res) { 
    res.sendfile(__dirname + req.url); 
}); 


app.all('/*', function(req, res) { 

    restler.get('http://myUrl.com:80/app_test.php/api' + req.url, { 

     }).on('complete', function (data) { 
       console.log(data) 
       res.json(data) 
      }); 

}); 
संबंधित मुद्दे