0x01. عن
عند كتابة HTTP ، يظهر رمز مشوّه عند تلقي طلبات HTTP. في وقت لاحق ، وجدت أن GZIP لم يتم إلغاء ضغطه.
فيما يتعلق بضغط GZIP/DEFLATE ، هناك طرق لوضع ضغط الأنابيب والضغط غير الأنسجة.
0x02.pipe الضغط
I/O in Node غير متزامن ، لذا فإن القراءة والكتابة على القرص والشبكة تتطلب القراءة والكتابة إلى البيانات من خلال وظائف رد الاتصال.
عندما لا يمكن تحميل البيانات التي يجب معالجتها في الذاكرة في وقت واحد ، أو عندما تكون المعالجة أكثر كفاءة أثناء القراءة ، نحتاج إلى استخدام تدفقات البيانات.
يوفر NodeJS عمليات على تدفقات البيانات من خلال تدفقات مختلفة.
يوفر الموقع الرسمي طرق خط الأنابيب:
نسخة الكود كما يلي:
// مثال طلب العميل
var zlib = require ('Zlib') ؛
var http = require ('http') ؛
var fs = require ('fs') ؛
var request = http.get ({host: 'homeway.me' ،
طريق: '/'،
الميناء: 80 ،
الرؤوس: {'قبول الترميز': 'gzip ، diflate'}}) ؛
request.on ('استجابة' ، وظيفة (استجابة) {
var output = fs.createwRiteStream ('izs.me_index.html') ؛
Switch (Response.Headers ['content-encoding']) {
// أو ، ما عليك سوى استخدام zlib.createunzip () للتعامل مع كلتا الحالتين
حالة "gzip":
استجابة. pipe (zlib.creategunzip ()). الأنابيب (الإخراج) ؛
استراحة؛
قضية "انحراف":
استجابة. pipe (zlib.createinflate ()). الأنابيب (الإخراج) ؛
استراحة؛
تقصير:
استجابة. pipe (الإخراج) ؛
استراحة؛
}
}) ؛
0x03. ضغط غير أنبوب
الرمز كما يلي:
نسخة الكود كما يلي:
#! /usr/محلي/صندوق/عقدة
var http = require ('http') ،
QueryString = مطلوب ('QueryString') ،
Zlib = مطلوب ('Zlib') ؛
var args = {
// المعلمات وبيانات النسخ الاحتياطي
المحتويات: QueryString.Stringify ({
// معلومات التعاقد
الاسم: 'homeway.me' ،
}) ،
} ؛
خيارات var = {
اسم المضيف: 'homeway.me' ،
الميناء: 80 ،
طريق: '/'،
الطريقة: "الحصول على" ،
الرؤوس: {
"قبول": "Text/HTML ، Application/XHTML+XML ، Application/XML ؛ Q = 0.9 ، Image/WebP ،*/*؛ Q = 0.8 '،
"طول المحتوى": args.contents.length ،
"عامل المستخدم": "Mozilla/5.0 (Macintosh ؛ Intel Mac OS X 10_10_2) AppleWebkit/537.36 (KHTML ، مثل Gecko) Chrome/42.0.2311.11 Safari/537.36" ،
"قبول الترميز": "gzip ، deflate" ،
} ،
} ؛
var get = function (الخيارات ، args ، رد الاتصال) {
var req = http.request (الخيارات ، الدالة (الدقة) {
VAR قطع = [] ، البيانات ، الترميز = res.Headers ['ترميز المحتوى'] ؛
// يجب تحويل غير GZIP/deflate إلى تنسيق UTF-8
if (الترميز === 'undefined') {
Res.SetEncoding ('UTF-8') ؛
}
res.on ('Data' ، function (chunk) {
chunks.push (قطعة) ؛
}) ؛
res.on ('end' ، function () {
var buffer = buffer.concat (قطع) ؛
if (الترميز == 'gzip') {
zlib.gunzip (العازلة ، الدالة (err ، فك التشفير) {
data = decoded.toString () ؛
رد الاتصال (err ، args ، res.Headers ، Data) ؛
}) ؛
} آخر إذا (الترميز == 'DEFLATE') {
zlib.inflate (العازلة ، الدالة (err ، فك التشفير) {
data = decoded.toString () ؛
رد الاتصال (err ، args ، res.Headers ، Data) ؛
}) ؛
} آخر {
البيانات = buffer.toString () ؛
رد الاتصال (null ، args ، res.Headers ، Data) ؛
}
}) ؛
}) ؛
req.write (args.contents) ؛
req.end () ؛
} ؛
احصل على (الخيارات ، args ، الوظيفة (err ، args ، الرؤوس ، البيانات) {
console.log ('==> header /n' ، الرؤوس) ؛
console.log ('== data /n' ، data) ؛
}) ؛
ما سبق هو كل nodejs حول ضغط gzip/deflate. أتمنى أن يحبها الجميع.