2013-01-07 7 views
6

के साथ पोस्ट बॉडी निकालें मेरे पास एक साधारण नोड ऐप है जो ग्राहकों से मीट्रिक लिखना चाहिए। ग्राहक जेसन प्रारूप में मेट्रिक्स भेजते हैं जो पाइथन के ज़्लिब मॉड्यूल के साथ ज़िप्ड किए जाते हैं, मैं एक्सप्रेस बॉडीफेस होने से पहले अनुरोध पोस्ट को अनजिप करने के लिए एक मिडलवेयर जोड़ने की कोशिश कर रहा हूं।नोड + एक्सप्रेस

मेरे middlewares बस डिफ़ॉल्ट रूप से एक्सप्रेस द्वारा प्रदान की हैं:

app.configure(function(){ 
    app.set('port', process.env.PORT || 3000); 
    app.set('views', __dirname + '/views'); 
    app.set('view engine', 'jade'); 
    app.use(express.favicon()); 
    app.use(express.logger('dev')); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(express.cookieParser('your secret here')); 
    app.use(express.session()); 
    app.use(app.router); 
    app.use(require('less-middleware')({ src: __dirname + '/public' })); 
    app.use(express.static(path.join(__dirname, 'public'))); 
}); 

मैं एक साधारण मिडलवेयर कि डेटा हो जाता है जोड़ने के लिए कोशिश की है और फिर इसे unzips:

app.use(function(req, res, next) { 
    var data = ''; 
    req.addListener("data", function(chunk) { 
     data += chunk; 
    }); 

    req.addListener("end", function() { 
     zlib.inflate(data, function(err, buffer) { 
      if (!err) { 
       req.body = buffer; 
       next(); 
      } else { 
       next(err); 
      } 
     }); 
    }); 
}); 

समस्या zlib.inflate के साथ है मुझे यह त्रुटि मिलती है:

Error: incorrect header check 

डेटा को संपीड़ित किया गया है अजगर के zlib मॉड्यूल:

zlib.compress(jsonString) 

लेकिन लगता है कि न तो unzip, बढ़, gunzip काम करता है।

+0

क्या आप वाकई एक zlib.unzip से और एक परिणाम के रूप में "गलती" नहीं मिलता हैं अगला() नहीं कहा जाता है? यदि ऐसा है, तो डेटा को सरणी को स्विच करने का प्रयास करें। यह उत्तर देखें http://stackoverflow.com/a/12776856/30763 इसके अतिरिक्त यह सुनिश्चित करें कि आपके मध्यवर्ती का उपयोग bodyParser से पहले किया जाता है। – Aaron

+0

वह उत्तर नोड द्वारा किए गए अनुरोध को अनजिप करने के लिए नहीं है और ग्राहक द्वारा नहीं? किसी भी मामले में – alex88

+1

@ alex88, आपको कोई त्रुटि होने पर 'अगली (गलती)' कॉल करनी चाहिए। मैं यह भी सुझाव देता हूं कि आप 'बॉडी पार्सर' मिडलवेयर से गुजरें और केवल 'req.body = JSON.parse (बफर)' सीधे करें। –

उत्तर

12

मिले अपने दम पर समाधान, समस्या कोड के इस टुकड़े के साथ था:

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

लगता है कि अनुरोध डेटा श्रृंखलाबद्ध सही नहीं है, इसलिए मैं इस के लिए मेरे मिडलवेयर स्विच कर लें:

app.use(function(req, res, next) { 
    var data = []; 
    req.addListener("data", function(chunk) { 
     data.push(new Buffer(chunk)); 
    }); 
    req.addListener("end", function() { 
     buffer = Buffer.concat(data); 
     zlib.inflate(buffer, function(err, result) { 
      if (!err) { 
       req.body = result.toString(); 
       next(); 
      } else { 
       next(err); 
      } 
     }); 
    }); 
}); 

संगत बफर पूरी तरह से काम करता है और अब मैं अनुरोध निकाय निकालने में सक्षम हूं।

+0

यदि आप सोच रहे हैं * क्यों *, ऐसा इसलिए है क्योंकि आपका पहला प्रयास कच्चे बाइनरी डेटा को एक स्ट्रिंग में परिवर्तित कर रहा था। चूंकि यूटीएफ -8 का मतलब मनमाने ढंग से बाइट्स (जैसे आप संकुचित डेटा स्ट्रीम में पाएंगे) को पकड़ने के लिए नहीं हैं, इसलिए आपका डेटा दूषित हो गया था। डिफ़ॉल्ट रूप से, ['data'] (http://nodejs.org/api/http.html#http_event_data) ईवेंट आपको एक [' बफर'] देता है (http://nodejs.org/api/buffer.html# buffer_buffer), जो नोड के कच्चे डेटा से निपटने का तरीका है। – josh3736

+0

@ josh3736 और स्ट्रिंग में कनवर्ट करना कुछ डेटा खो रहा था? तो हिस्सा पहले से ही एक बफर है और मैं आसानी से एक नया बफर बनाने के बजाय धक्का दे सकता हूं? – alex88

+0

[हां। 'डेटा' ईवेंट के लिए दस्तावेज़ों से:] (http://nodejs.org/api/http.html#http_event_data)" * 'chunk' एक स्ट्रिंग है यदि एक एन्कोडिंग' request.setEncoding() के साथ सेट की गई है ', अन्यथा यह' बफर 'है। * " – josh3736

1

मैं जानता हूँ कि यह एक बहुत ही देर से प्रतिक्रिया है, लेकिन मॉड्यूल body-parser साथ, यह:

Returns middleware that only parses json. This parser accepts any Unicode encoding of the body and supports automatic inflation of gzip and deflate encodings.

var bodyParser = require('body-parser'); 
app.use(bodyParser.json());  // to support JSON-encoded bodies