2013-09-10 11 views
18
  1. मैं एक्सप्रेस में आने वाले POST अनुरोध को सुनना चाहता हूं।
  2. मैं पाइप के लिए एक और सर्वर
  3. मैं एक्सप्रेस हैंडलर के अंदर प्रतिक्रिया प्राप्त करना चाहते हैं (मैं न रेस धारा व्यक्त करने के लिए पाइप प्रतिक्रिया करना चाहते हैं)

के लिए करने के लिए इस अनुरोध को चाहते हैं अब मैं कोड निम्नलिखित है:एक्सप्रेस req.pipe() काम नहीं करता

app.post('server1',function(req,res,next){ 
    var request = require('request'); 
    req.pipe(request.post('server2')).pipe(res); 

} 

तो यह काम नहीं करता है - अनुरोध सर्वर 2 तक भी पाइप नहीं किया गया है - मैंने इसे चेक किया है और कोई आने वाला अनुरोध नहीं है।


मैं 1 & 2 इस तरह अंक हल:

var bodyParser = express.bodyParser(); 

app.use(function(req,res,next){ 

    if(req.path == '/server1' && req.method == 'POST') { 
     return next(); 
    } 
    else { 
     bodyParser(req,res,next); 
    } 
}); 

नहीं बहुत अच्छा है, लेकिन यह काम करता है - यह सिर्फ एक मार्ग (पोस्ट/server1) के लिए bodyparser अक्षम करता है।

लेकिन मैं अभी भी पाइप अनुरोध से json प्रतिक्रिया शरीर प्राप्त करने के लिए पता नहीं कैसे - मैं कोड निम्नलिखित है:

app.post('/server1',function(req,res,next){ 

    var request = require('request'); 
    var pipe = req.pipe(request.post('/server2')); 

    pipe.on('end',function(){ 

     var res2 = pipe.response; 
     console.log(res2); 

    }); 
}); 

res2 वस्तु सही statusCode और हेडर और इतने पर है, लेकिन यह शरीर में नहीं है - मैं इसे res2 ऑब्जेक्ट से कैसे प्राप्त कर सकता हूं? /server2 json में कुछ डेटा देता है, लेकिन मुझे पता है कि प्रतिक्रिया से इसे पढ़ने के लिए न ...

+11

इसका शायद मतलब है कि 'req' को पूरा करने के लिए पहले से ही पढ़ा जा चुका है - इसके [' 'end''] (http://nodejs.org/api/stream.html#stream_event_end) - संभवतः 'bodyParser द्वारा() '। एक धारा * उसके बाद एक नई 'पाइप()' के लिए * पुनरारंभ नहीं होगी *। –

+0

ठीक है तो मैं इसे पूरा करने के लिए कैसे पढ़ा जा सकता हूं? या मैं पहले से पढ़े गए अनुरोध से स्ट्रीम कैसे बना सकता हूं? मुझे पाइप अनुरोध करना है क्योंकि फ़ाइल अपलोड है ... – user606521

+0

मैं अपना प्रश्न संपादित करता हूं - 'बॉडी पार्सर' पर आपकी टिप्पणी ने मुझे बहुत मदद की - मुझे बस अंतिम बिंदु (3) को हल करने की आवश्यकता है। – user606521

उत्तर

14

क्योंकि bodyParser पारसर्स

+2

यह मेरी समस्या थी! धन्यवाद! – Stasel

+0

आप महोदय, मेरे गधे को बचाया: पी धन्यवाद;) –

4

मुझे लगता है कि आप बहुत करीब हैं के साथ सभी निकायों को बीच में रोक यह काम नहीं करता। आप प्रतिक्रिया इकट्ठा करने के लिए पाइप पर data घटनाओं पर सुनने चाहिए: जब से तुम "bodyParser() रास्ते में आ" हल,

app.post('/server1',function(req,res,next) { 
    var request = require('request'); 
    var pipe  = req.pipe(request.post('/server2')); 
    var response = []; 

    pipe.on('data',function(chunk) { 
    response.push(chunk); 
    }); 

    pipe.on('end',function() { 
    var res2 = Buffer.concat(response); 
    console.log(res2); 
    // don't forget to end the 'res' response after this! 
    ... 
    }); 
}); 

हालांकि समस्या, आप भी अपने प्रारंभिक पाइप सेटअप अगर आप सिर्फ चाहते उपयोग कर सकते हैं सर्वर 2 द्वारा उत्पन्न प्रतिक्रिया को वापस करने के लिए (request का उपयोग करते समय उचित यूआरएल का उपयोग करना सुनिश्चित करें)।

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