Bassel Jhr نشر 28 أغسطس 2021 أرسل تقرير نشر 28 أغسطس 2021 في حال تم استخدام gzip وضغط محتوى body للطلبات من خلال node.js، كيف يمكن إعادة فك ضغطها؟ لقد حاولت استخدام الدالة createGunzip كما في التوثيق الرسمي: switch (response.headers['content-encoding']) { case 'br': pipeline(response, zlib.createBrotliDecompress(), output, onError); break; case 'gzip': pipeline(response, zlib.createGunzip(), output, onError); break; case 'deflate': pipeline(response, zlib.createInflate(), output, onError); break; default: pipeline(response, output, onError); break; } ولكنها لم تنجح، فما هي الطريقة الصحيحة لإجراء ذلك؟ 2 اقتباس
1 Sam Ahw نشر 28 أغسطس 2021 أرسل تقرير نشر 28 أغسطس 2021 يمكنك فك الضغط من خلال http نفسه عن طريق تخزين فك التشفير في buffer وإضافة الرد response إلى gunzip من خلال pipe كالتالي: var http = require("http"), zlib = require("zlib"); function getGzipped(url, callback) { var buffer_stream = []; http.get(url, function(res) { var gunzip = zlib.createGunzip(); res.pipe(gunzip); gunzip.on('data', function(data) { // إضافة الجزء الجاهز من فك التشفير إلى buffer buffer.push(data.toString()) }).on("end", function() { //تجميع الأجزاء وإرسال الرد callback(null, buffer.join("")); }).on("error", function(e) { callback(e); }) }).on('error', function(e) { callback(e) }); } getGzipped(url, function(err, result) { console.log(result); }); كما يمكنك تجنّب ذلك من خلال إضافة خيار encoding: null إلى الطلب request وبذلك ستتجنّب تحويل الجزء الذي يتم تحميله من جسم الطلب body إلى النمط string ويبقى بشكل binary buffer مثال: request = require('request'); zlib = require('zlib'); request(url, {encoding: null}, function(err, response, body){ if(response.headers['content-encoding'] == 'gzip'){ zlib.gunzip(body, function(err, dezipped) { callback(dezipped.toString()); }); } else { callback(body); } }); 1 اقتباس
1 Ali Haidar Ahmad نشر 28 أغسطس 2021 أرسل تقرير نشر 28 أغسطس 2021 يتعامل الموديول Request مع استجابة gzip. من أجل جعل الموديول request يقوم بفك تشفير وسيطة الجسم body argument في وظيفة رد الاتصال callback function، يتعين علينا ضبط "gzip" على true في الخيارات. مثال: var opts = { uri: 'some uri which return gzip data', gzip: true } request(opts, function (err, res, body) { //سيحتويان على المحتوى الذي تم فك تشفيره res.body و body ألآن ال }) أيضاً هناك مشكلة مماثلة نواجهاها عادةً أثناء العمل مع request module وهي JSON parsing، تحليل JSON. إذا كنت تريد من request module أن يقوم بتحليل ال body تلقائياً وتزويدك بمحتوى JSON في ال body argument. يجب عليك ضبط "json" على true في الخيارات: var opts = { uri:'some uri that provides json data', json: true } request(opts, function (err, res, body) { //سيحتويان على المحتوى الذي تم فك تشفيره res.body و body ألآن ال }) اقتباس
0 Salah Eddin Beriani2 نشر 28 أغسطس 2021 أرسل تقرير نشر 28 أغسطس 2021 باستخدام got ، وهو بديل ل request ، يمكنك ببساطة القيام بما يلي: const got = require("got") got(url).then(response => { console.log(response.body); }); يتم التعامل مع decompression تلقائيًا عند الحاجة دون الحاجة للتعامل معه بنفسك. اقتباس
السؤال
Bassel Jhr
في حال تم استخدام gzip وضغط محتوى body للطلبات من خلال node.js، كيف يمكن إعادة فك ضغطها؟
لقد حاولت استخدام الدالة createGunzip كما في التوثيق الرسمي:
switch (response.headers['content-encoding']) { case 'br': pipeline(response, zlib.createBrotliDecompress(), output, onError); break; case 'gzip': pipeline(response, zlib.createGunzip(), output, onError); break; case 'deflate': pipeline(response, zlib.createInflate(), output, onError); break; default: pipeline(response, output, onError); break; }
ولكنها لم تنجح، فما هي الطريقة الصحيحة لإجراء ذلك؟
3 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.