जब मैं एक्सप्रेस का उपयोग करता हूं, और मेरा कोड है:
app.use(express.bodyParser());
मुझे कच्चा अनुरोध निकाय कैसे मिलेगा ?
जवाबों:
संपादित करें 2: बॉडी पार्सर मॉड्यूल के 1.15.2 रिलीज कच्चे मोड का परिचय देता है , जो शरीर को बफर के रूप में लौटाता है । डिफ़ॉल्ट रूप से, यह स्वचालित रूप से अपस्फीति और गज़िप अपघटन को भी संभालता है। उदाहरण उपयोग:
var bodyParser = require('body-parser');
app.use(bodyParser.raw(options));
app.get(path, function(req, res) {
// req.body is a Buffer object
});
डिफ़ॉल्ट रूप से, options
ऑब्जेक्ट में निम्न डिफ़ॉल्ट विकल्प होते हैं:
var options = {
inflate: true,
limit: '100kb',
type: 'application/octet-stream'
};
यदि आप अपने कच्चे पार्सर को अन्य MIME प्रकारों के अलावा पार्स करना चाहते हैं application/octet-stream
, तो आपको इसे यहां बदलने की आवश्यकता होगी। यह वाइल्डकार्ड मिलान जैसे कि */*
या का भी समर्थन करेगा */application
।
नोट: निम्नलिखित उत्तर एक्सप्रेस 4 से पहले के संस्करणों के लिए है, जहां मिडलवेयर अभी भी ढांचे के साथ बंडल किया गया था। आधुनिक समकक्ष बॉडी-पार्सर मॉड्यूल है, जिसे अलग से स्थापित किया जाना चाहिए।
rawBody
एक्सप्रेस में संपत्ति एक बार उपलब्ध था, लेकिन संस्करण 1.5.1 के बाद से हटा दिया। कच्चा अनुरोध निकाय प्राप्त करने के लिए, आपको बॉडीपार का उपयोग करने से पहले कुछ मिडलवेयर में डालना होगा। आप इसके बारे में GitHub चर्चा भी पढ़ सकते हैं ।
app.use(function(req, res, next) {
req.rawBody = '';
req.setEncoding('utf8');
req.on('data', function(chunk) {
req.rawBody += chunk;
});
req.on('end', function() {
next();
});
});
app.use(express.bodyParser());
वह मिडलवेयर वास्तविक डेटा स्ट्रीम से पढ़ेगा, और उसे rawBody
अनुरोध की संपत्ति में संग्रहीत करेगा । आप इस तरह कच्चे शरीर तक पहुँच सकते हैं:
app.post('/', function(req, res) {
// do something with req.rawBody
// use req.body for the parsed body
});
संपादित करें: ऐसा लगता है कि यह विधि और बॉडीपार सह-अस्तित्व के लिए मना कर देती है, क्योंकि एक दूसरे से पहले अनुरोध स्ट्रीम का उपभोग करेगा, जो कभी भी आग न लगाने के लिए दूसरा है end
, इस प्रकार कभी फोन नहीं करता है next()
, और आपके आवेदन को लटका देता है।
सबसे सरल समाधान बॉडीपार के स्रोत को संशोधित करने की सबसे अधिक संभावना होगी, जो आपको कनेक्ट के JSON पार्सर की लाइन 57 पर मिलेगा । यह वह है जो संशोधित संस्करण जैसा दिखेगा।
var buf = '';
req.setEncoding('utf8');
req.on('data', function(chunk){ buf += chunk });
req.on('end', function() {
req.rawBody = buf;
var first = buf.trim()[0];
...
});
आपको इस स्थान पर फ़ाइल मिलेगी:
/node_modules/express/node_modules/connect/lib/middleware/json.js
।
मुझे एक समाधान मिला जो बॉडीपैर के साथ अच्छा खेलता है, बॉडीपेयर में verify
कॉलबैक का उपयोग करता है । इस कोड में, मैं इसका उपयोग सामग्री का एक sha1 पाने के लिए कर रहा हूं और कच्चा शरीर भी प्राप्त कर रहा हूं।
app.use(bodyParser.json({
verify: function(req, res, buf, encoding) {
// sha1 content
var hash = crypto.createHash('sha1');
hash.update(buf);
req.hasha = hash.digest('hex');
console.log("hash", req.hasha);
// get rawBody
req.rawBody = buf.toString();
console.log("rawBody", req.rawBody);
}
}));
मैं Node.js और express.js में नया हूं (कल शुरू हुआ, शाब्दिक रूप से!) तो मैं इस समाधान पर टिप्पणी सुनना चाहूंगा।
req.rawBody = buf.toString();
और बाकी को verify
समारोह से बाहर ले गया , क्योंकि मुझे बस इतना ही चाहिए था, और इसने खूबसूरती से काम किया। BodyParser स्रोत कोड को बदलने की कोई आवश्यकता नहीं है!
req.rawBody = buf.toString(encoding);
application/json
अनुरोधों को पकड़ लेगा
इस समाधान ने मेरे लिए काम किया:
var rawBodySaver = function (req, res, buf, encoding) {
if (buf && buf.length) {
req.rawBody = buf.toString(encoding || 'utf8');
}
}
app.use(bodyParser.json({ verify: rawBodySaver }));
app.use(bodyParser.urlencoded({ verify: rawBodySaver, extended: true }));
app.use(bodyParser.raw({ verify: rawBodySaver, type: '*/*' }));
जब मैं req.on('data', function(chunk) { });
इसके साथ समाधान का उपयोग करता हूं तो यह अनुरोधित शरीर पर काम नहीं करता है।
उन अन्य उत्तरों के साथ सावधान रहें, क्योंकि वे बॉडीपेयर के साथ ठीक से नहीं खेलेंगे यदि आप भी json, urlencoded इत्यादि का समर्थन करना चाहते हैं, तो इसे बॉडीपेयर के साथ काम करने के लिए आप अपने हैंडलर को केवल Content-Type
हेडर (एस) पर रजिस्टर करने के लिए शर्त रखें कि आप देखभाल के बारे में, जैसे कि bodyParser खुद करता है।
के साथ एक अनुरोध के कच्चे शरीर सामग्री प्राप्त करने के Content-Type: "text/plain"
में req.rawBody
आप कर सकते हैं:
app.use(function(req, res, next) {
var contentType = req.headers['content-type'] || ''
, mime = contentType.split(';')[0];
if (mime != 'text/plain') {
return next();
}
var data = '';
req.setEncoding('utf8');
req.on('data', function(chunk) {
data += chunk;
});
req.on('end', function() {
req.rawBody = data;
next();
});
});
app.use(bodyParser.urlencoded({limit: '80mb', extended: true})); app.use(bodyParser.json({limit: '80mb'})); app.use(bodyParser.raw({type: 'application/octet-stream'}))
यह भी करेगा।
यह ऊपर दिए गए हेक्सासैनाइड के उत्तर पर एक भिन्नता है। यह मिडिलवेयर 'डेटा' ईवेंट को भी हैंडल करता है, लेकिन 'नेक्स्ट' कॉल करने से पहले डेटा के उपभोग करने की प्रतीक्षा नहीं करता है। इस तरह यह दोनों मिडलवेयर और बॉडीपेयर कोएक्सिस्ट हो सकता है, जो कि समानांतर में धारा का उपभोग करता है।
app.use(function(req, res, next) {
req.rawBody = '';
req.setEncoding('utf8');
req.on('data', function(chunk) {
req.rawBody += chunk;
});
next();
});
app.use(express.bodyParser());
बॉडी-पार्सर का उपयोग करें शरीर को पार्स करें जो यह होगा:
app.use(bodyParser.text());
app.use(bodyParser.urlencoded());
app.use(bodyParser.raw());
app.use(bodyParser.json());
अर्थात। यदि आपको कच्ची पाठ फ़ाइल मिलनी है, तो चलाएं .text()
।
वर्तमान में बॉडी-पार्सर का समर्थन करता है