دليل Node.js ، الجزء 10: الوحدات النمطية القياسية والجداول وقواعد البيانات و NODE_ENV

تختتم هذه المادة بسلسلة Node.js. للترجمة اليدوية. سنتحدث اليوم عن نظام التشغيل ، والأحداث ، ووحدات http ، ونناقش العمل مع التدفقات وقواعد البيانات ، ومناقشة استخدام Node.js في تطوير التطبيقات وإنتاجها.




Node.js os module


توفر وحدة os إمكانية الوصول إلى العديد من الوظائف التي يمكن استخدامها للحصول على معلومات حول نظام التشغيل وأجهزة الكمبيوتر التي تشغل Node.js. هذه وحدة قياسية ، لا تحتاج إلى تثبيتها ، للعمل معها من الرمز ، فقط قم بتوصيلها:

 const os = require('os') 

هناك العديد من الخصائص المفيدة هنا ، والتي ، على وجه الخصوص ، قد تكون مفيدة عند العمل مع الملفات.

لذا ، تتيح os.EOL خاصية os.EOL معرفة فاصل الخط المستخدم في النظام ( os.EOL خط). على Linux و macOS ، هذا \n على Windows ، \r\n .

وتجدر الإشارة إلى أنه عندما نذكر "Linux و macOS" هنا ، فإننا نتحدث عن الأنظمة الأساسية المتوافقة مع POSIX. من أجل الإيجاز ، لا نذكر منصات أقل شعبية هنا.

توفر الخاصية os.constants.signals معلومات حول الثوابت المستخدمة لمعالجة إشارات المعالجة مثل SIGHUP و SIGKILL وما إلى ذلك. هنا يمكنك العثور على تفاصيل عنها.

تحتوي الخاصية os.constants.errno على الثوابت المستخدمة لرسائل الخطأ - مثل EADDRINUSE ، EOVERFLOW .

الآن فكر في الطرق الرئيسية لوحدة os .

▍os.arch ()


تُرجع هذه الطريقة سلسلة تحدد بنية النظام ، على سبيل المثال ، arm ، x64 ، arm64 .

▍os.cpus ()


إرجاع معلومات حول المعالجات المتوفرة في النظام. على سبيل المثال ، قد تبدو هذه المعلومات كما يلي:

 [ { model: 'Intel(R) Core(TM)2 Duo CPU     P8600 @ 2.40GHz',   speed: 2400,   times:    { user: 281685380,      nice: 0,      sys: 187986530,      idle: 685833750,      irq: 0 } }, { model: 'Intel(R) Core(TM)2 Duo CPU     P8600 @ 2.40GHz',   speed: 2400,   times:    { user: 282348700,      nice: 0,      sys: 161800480,      idle: 703509470,      irq: 0 } } ] 

▍os.endianness ()


إرجاع BE أو LE بناءً على ترتيب البايت (Big Engian أو Little Endian) الذي تم استخدامه لتجميع الملف الثنائي Node.js.

▍os.freemem ()


إرجاع مقدار ذاكرة النظام الحرة بالبايت.

▍os.homedir ()


إرجاع المسار إلى الدليل الرئيسي للمستخدم الحالي. على سبيل المثال ، '/Users/flavio' .

▍os.hostname ()


إرجاع اسم المضيف.

▍os.loadavg ()


إرجاع ، في صفيف ، متوسط ​​بيانات الحمل المحسوبة بواسطة نظام التشغيل. هذه المعلومات منطقية فقط على Linux و macOS. يمكن أن تبدو مثل هذا:

 [ 3.68798828125, 4.00244140625, 11.1181640625 ] 

▍os.networkInterfaces ()


إرجاع معلومات حول واجهات الشبكة المتوفرة على النظام. على سبيل المثال:

 { lo0:  [ { address: '127.0.0.1',      netmask: '255.0.0.0',      family: 'IPv4',      mac: 'fe:82:00:00:00:00',      internal: true },    { address: '::1',      netmask: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',      family: 'IPv6',      mac: 'fe:82:00:00:00:00',      scopeid: 0,      internal: true },    { address: 'fe80::1',      netmask: 'ffff:ffff:ffff:ffff::',      family: 'IPv6',      mac: 'fe:82:00:00:00:00',      scopeid: 1,      internal: true } ], en1:  [ { address: 'fe82::9b:8282:d7e6:496e',      netmask: 'ffff:ffff:ffff:ffff::',      family: 'IPv6',      mac: '06:00:00:02:0e:00',      scopeid: 5,      internal: false },    { address: '192.168.1.38',      netmask: '255.255.255.0',      family: 'IPv4',      mac: '06:00:00:02:0e:00',      internal: false } ], utun0:  [ { address: 'fe80::2513:72bc:f405:61d0',      netmask: 'ffff:ffff:ffff:ffff::',      family: 'IPv6',      mac: 'fe:80:00:20:00:00',      scopeid: 8,      internal: false } ] } 

▍os.platform ()


إرجاع معلومات حول النظام الأساسي الذي تم تجميع Node.js. من أجله. فيما يلي بعض القيم المرجعة المحتملة:

  • داروين
  • فري
  • لينكس
  • openbsd
  • WIN32

▍os.release ()


إرجاع سلسلة تحدد رقم إصدار نظام التشغيل.

▍os.tmpdir ()


إرجاع المسار إلى الدليل المحدد في النظام لتخزين الملفات المؤقتة.

▍os.totalmem ()


إرجاع إجمالي حجم ذاكرة النظام بالبايت.

▍os.type ()


إرجاع المعلومات التي تحدد نظام التشغيل. على سبيل المثال:

  • Linux - لينكس.
  • Darwin - macOS.
  • Windows_NT - Windows.

▍os.uptime ()


إرجاع وقت تشغيل النظام بالثواني منذ آخر إعادة تشغيل.

وحدة أحداث Node.js


توفر لنا وحدة events فئة EventEmitter ، والتي تم تصميمها للعمل مع الأحداث على منصة Node.js. لقد تحدثنا بالفعل قليلاً عن هذه الوحدة في الجزء السابع من هذه السلسلة من المواد. هنا هو وثائق لها. هنا نلقي نظرة على API لهذه الوحدة. تذكر أنه لاستخدامه في الرمز ، يجب توصيله ، كما هو الحال عادةً مع الوحدات القياسية. بعد ذلك ، تحتاج إلى إنشاء كائن EventEmitter جديد. يبدو هذا:

 const EventEmitter = require('events') const door = new EventEmitter() 

يستخدم كائن الفئة EventEmitter آليات قياسية ، على وجه الخصوص ، الأحداث التالية:

  • newListener - يتم newListener هذا الحدث عند إضافة معالج حدث.
  • removeListener - تسمى عند إزالة المعالج.

خذ بعين الاعتبار الأساليب الأكثر فائدة لكائنات فئة EventEmitter ( EventEmitter إلى كائن مشابه في أسماء الأساليب على أنه emitter ).

itteremitter.addListener ()


اسم مستعار emitter.on() .

itteremitter.emit ()


يولد حدث. استدعاء كافة معالجات الأحداث بشكل متزامن بالترتيب الذي تم تسجيلها به.

▍emitter.eventNames ()


إرجاع صفيف يحتوي على الأحداث المسجلة.

▍emitter.getMaxListeners ()


إرجاع الحد الأقصى لعدد المعالجات التي يمكن إضافتها إلى كائن من فئة EventEmitter . القيمة الافتراضية هي 10. إذا لزم الأمر ، يمكن زيادة هذه المعلمة أو تقليلها باستخدام طريقة setMaxListeners() .

itteremitter.listenerCount ()


إرجاع عدد معالجات الأحداث التي تم تمرير اسمها إلى هذه الطريقة كمعلمة:

 door.listenerCount('open') 

▍emitter.listeners ()


إرجاع صفيف من معالجات الأحداث للحدث المقابل ، الذي تم تمرير اسمه إلى هذه الطريقة:

 door.listeners('open') 

▍emitter.off ()


اسم مستعار emitter.removeListener() المقدمة في العقدة 10.

▍emitter.on ()


تسجيل رد اتصال يتم استدعاؤه عند إنشاء حدث. إليك كيفية استخدامه:

 door.on('open', () => { console.log('Door was opened') }) 

▍emitter.once ()


يسجل رد الاتصال الذي يتم استدعاؤه مرة واحدة فقط - عند أول حدث تم تسجيل رد الاتصال له. على سبيل المثال:

 const EventEmitter = require('events') const ee = new EventEmitter() ee.once('my-event', () => { //         }) 

itteremitter.prependListener ()


عند تسجيل معالج باستخدام الأساليب on() أو addListener() ، تتم إضافة هذا المعالج إلى نهاية قائمة انتظار المعالج ويتم استدعاؤه لمعالجة الحدث المقابل. عند استخدام طريقة prependListener() ، تتم إضافة المعالج إلى مقدمة قائمة الانتظار ، مما يؤدي إلى استدعائه أولاً لمعالجة الحدث.

itteremitter.prependOnceListener ()


هذه الطريقة مشابهة للطريقة السابقة. وبالتحديد ، عندما يتم تسجيل معالج مخصص لمكالمة واحدة باستخدام طريقة once() ، فهو الأخير في قائمة انتظار المعالجات وآخر من يتم استدعاؤه. تتيح لك طريقة prependOnceListener() إضافة مثل هذا المعالج إلى مقدمة قائمة الانتظار.

itteremitter.removeAllListeners ()


تحذف هذه الطريقة كافة المعالجات لحدث معين مسجل في الكائن المقابل. يستخدمونها على هذا النحو:

 door.removeAllListeners('open') 

▍emitter.removeListener ()


حذف المعالج المحدد ليتم تمريره إلى هذه الطريقة. من أجل حفظ المعالج للحذف اللاحق ، يمكن تعيين رد الاتصال المقابل لمتغير. يبدو هذا:

 const doSomething = () => {} door.on('open', doSomething) door.removeListener('open', doSomething) 

itteremitter.setMaxListeners ()


تسمح لك هذه الطريقة بتحديد الحد الأقصى لعدد المعالجات التي يمكن إضافتها إلى حدث واحد في مثيل لفئة EventEmitter . بشكل افتراضي ، كما ذكرنا سابقًا ، يمكنك إضافة ما يصل إلى 10 معالجات لحدث معين. يمكن تغيير هذه القيمة. استخدم هذه الطريقة على النحو التالي:

 door.setMaxListeners(50) 

Node.js http الوحدة النمطية


في الجزء الثامن من هذه السلسلة من المواد ، تحدثنا بالفعل عن الوحدة النمطية Node.js http القياسية. يضع تحت تصرف آليات المطورين المصممة لإنشاء خوادم HTTP. وهي الوحدة الرئيسية المستخدمة لحل مشاكل تبادل البيانات عبر الشبكة في Node.js. يمكنك توصيله في الكود مثل هذا:

 const http = require('http') 

يتكون من خصائص وأساليب وفئات. لنتحدث عنهم.

▍العقارات


طرق http


تسرد هذه الخاصية جميع طرق HTTP المدعومة:

 > require('http').METHODS [ 'ACL', 'BIND', 'CHECKOUT', 'CONNECT', 'COPY', 'DELETE', 'GET', 'HEAD', 'LINK', 'LOCK', 'M-SEARCH', 'MERGE', 'MKACTIVITY', 'MKCALENDAR', 'MKCOL', 'MOVE', 'NOTIFY', 'OPTIONS', 'PATCH', 'POST', 'PROPFIND', 'PROPPATCH', 'PURGE', 'PUT', 'REBIND', 'REPORT', 'SEARCH', 'SUBSCRIBE', 'TRACE', 'UNBIND', 'UNLINK', 'UNLOCK', 'UNSUBSCRIBE' ] 

http.STATUS_CODES


يحتوي على رموز حالة HTTP ووصفها:

 > require('http').STATUS_CODES { '100': 'Continue', '101': 'Switching Protocols', '102': 'Processing', '200': 'OK', '201': 'Created', '202': 'Accepted', '203': 'Non-Authoritative Information', '204': 'No Content', '205': 'Reset Content', '206': 'Partial Content', '207': 'Multi-Status', '208': 'Already Reported', '226': 'IM Used', '300': 'Multiple Choices', '301': 'Moved Permanently', '302': 'Found', '303': 'See Other', '304': 'Not Modified', '305': 'Use Proxy', '307': 'Temporary Redirect', '308': 'Permanent Redirect', '400': 'Bad Request', '401': 'Unauthorized', '402': 'Payment Required', '403': 'Forbidden', '404': 'Not Found', '405': 'Method Not Allowed', '406': 'Not Acceptable', '407': 'Proxy Authentication Required', '408': 'Request Timeout', '409': 'Conflict', '410': 'Gone', '411': 'Length Required', '412': 'Precondition Failed', '413': 'Payload Too Large', '414': 'URI Too Long', '415': 'Unsupported Media Type', '416': 'Range Not Satisfiable', '417': 'Expectation Failed', '418': 'I\'ma teapot', '421': 'Misdirected Request', '422': 'Unprocessable Entity', '423': 'Locked', '424': 'Failed Dependency', '425': 'Unordered Collection', '426': 'Upgrade Required', '428': 'Precondition Required', '429': 'Too Many Requests', '431': 'Request Header Fields Too Large', '451': 'Unavailable For Legal Reasons', '500': 'Internal Server Error', '501': 'Not Implemented', '502': 'Bad Gateway', '503': 'Service Unavailable', '504': 'Gateway Timeout', '505': 'HTTP Version Not Supported', '506': 'Variant Also Negotiates', '507': 'Insufficient Storage', '508': 'Loop Detected', '509': 'Bandwidth Limit Exceeded', '510': 'Not Extended', '511': 'Network Authentication Required' } 

http.globalAgent


تشير هذه الخاصية إلى المثيل http.Agent لفئة http.Agent . يتم استخدامه لإدارة الاتصالات. يمكن اعتباره مكونًا رئيسيًا للنظام الفرعي Node.js. HTTP. سنتحدث أكثر عن http.Agent الطبقة أدناه.

etالطرق


http.createServer ()


إرجاع مثيل جديد لفئة http.Server . إليك كيفية استخدام هذه الطريقة لإنشاء خادم HTTP:

 const server = http.createServer((req, res) => { //      }) 

http.request ()


يسمح لك بإجراء طلب HTTP إلى الخادم عن طريق إنشاء مثيل لفئة http.ClientRequest .

http.get ()


يشبه هذا الأسلوب http.request() ، لكنه يضبط تلقائيًا طريقة HTTP على GET ويستدعي تلقائيًا أمرًا من النموذج req.end() .

▍ الفئات


توفر وحدة HTTP 5 فئات - Agent و ClientRequest و Server و ServerResponse و IncomingMessage . اعتبرهم.

وكيل http


يتم استخدام المثيل http.Agent لفئة http.Agent التي تم إنشاؤها بواسطة Node.js لإدارة الاتصالات. يتم استخدامه كقيمة افتراضية لجميع طلبات HTTP ويوفر الانتظار وإعادة استخدام المقابس. بالإضافة إلى ذلك ، فإنه يدعم تجمع مأخذ توصيل ، والذي يسمح للأداء العالي للنظام الفرعي لشبكة Node.js. إذا لزم الأمر ، يمكنك إنشاء كائن http.Agent الخاص بك.

http.ClientRequest


يتم إنشاء كائن من فئة http.ClientRequest ، وهو طلب قيد التشغيل ، عند http.request() أو http.get() . عند تلقي استجابة لطلب ، يتم رفع حدث الاستجابة ، حيث يتم إرسال الاستجابة - مثيل http.IncomingMessage . يمكن معالجة البيانات التي تم الحصول عليها بعد إكمال الاستعلام بطريقتين:

  • يمكنك استدعاء الأسلوب response.read() .
  • في معالج حدث response ، يمكنك تكوين مستمع لحدث data ، والذي يسمح لك بالعمل مع دفق البيانات.

http.Server


يتم استخدام مثيلات هذه الفئة لإنشاء خوادم باستخدام الأمر http.createServer() . بعد أن يكون لدينا كائن خادم ، يمكننا استخدام طرقه:

  • يتم استخدام طريقة listen() لبدء تشغيل الخادم والانتظار ومعالجة الطلبات الواردة.
  • توقف طريقة close() الخادم.

http.ServerResponse


يتم إنشاء هذا الكائن بواسطة فئة http.Server ويتم تمريره كمعلمة ثانية لحدث request عند حدوثه. عادة ، يتم تعيين اسم هذه الكائنات في التعليمات البرمجية:

 const server = http.createServer((req, res) => { //res -   http.ServerResponse }) 

في مثل هذه المعالجات ، بعد أن تكون استجابة الخادم جاهزة للإرسال إلى العميل ، يتم استدعاء الأسلوب end() ، الذي يكمل الاستجابة. يجب استدعاء هذه الطريقة بعد الانتهاء من كل استجابة.

فيما يلي الأساليب المستخدمة للعمل مع رؤوس HTTP:

  • getHeaderNames() - إرجاع قائمة بأسماء الرؤوس المثبتة.
  • getHeaders() - إرجاع نسخة من رؤوس HTTP المحددة.
  • setHeader('headername', value) - setHeader('headername', value) الرأس المحدد.
  • getHeader('headername') - لإرجاع رأس المجموعة.
  • removeHeader('headername') - يزيل الرأس المثبت.
  • hasHeader('headername') - تُرجع true إذا كانت الاستجابة تحتوي بالفعل على رأس تم تمرير اسمه إلى هذه الطريقة.
  • headersSent() - إرجاع true إذا تم إرسال الرؤوس بالفعل إلى العميل.

بعد معالجة الرؤوس ، يمكن إرسالها إلى العميل عن طريق استدعاء الأسلوب response.writeHead() ، والذي ، كمعلمة أولى ، يأخذ رمز الحالة. كمعلمتين ثانية وثالثة ، يمكن تمرير رسالة تتوافق مع رمز الحالة والعناوين.

لإرسال البيانات إلى العميل ، يتم استخدام طريقة write() في نص الاستجابة. يرسل البيانات المخزنة إلى دفق استجابة HTTP.

إذا لم يتم تعيين الرؤوس حتى الآن باستخدام الأمر response.writeHead() ، فسيتم إرسال الرؤوس التي تحتوي على رمز الحالة والرسالة المحددة في الطلب أولاً. يمكنك تعيين قيمها عن طريق تعيين قيم statusCode و statusMessage :

 response.statusCode = 500 response.statusMessage = 'Internal Server Error' 

http.IncomingMessage


يتم إنشاء كائن من فئة http.IncomingMessage في سياق الآليات التالية:

  • http.Server - عند معالجة حدث request .
  • http.ClientRequest - عند التعامل مع حدث response .

يمكن استخدامه للعمل مع بيانات الاستجابة. وهي:

  • لمعرفة رمز حالة الاستجابة والرسالة المقابلة ، يتم استخدام خصائص رمز الحالة statusCode statusMessage .
  • يمكنك مشاهدة headers الاستجابة من headers rawHearders headers أو rawHearders (للحصول على قائمة rawHearders الأولية).
  • يمكنك معرفة طريقة الطلب باستخدام خاصية method .
  • لمعرفة إصدار HTTP المستخدم ، استخدم خاصية httpVersion .
  • يتم استخدام خاصية url للحصول على URL.
  • تتيح لك خاصية socket الحصول على كائن net.Socket المرتبط بالاتصال.

يتم تقديم بيانات الاستجابة كتدفق منذ أن http.IncomingMessage كائن http.IncomingMessage بتنفيذ واجهة Readable Stream http.IncomingMessage Readable Stream .

العمل مع التدفقات في Node.js


مؤشرات الترابط هي أحد المفاهيم الأساسية المستخدمة في تطبيقات Node.js. التدفقات هي أدوات تسمح لك بقراءة الملفات وكتابتها ، وتنظيم تفاعل الشبكة بين الأنظمة ، وبشكل عام ، تنفيذ عمليات تبادل البيانات بشكل فعال.

مفهوم المواضيع لا يقتصر على Node.js. ظهرت على عائلة أنظمة تشغيل Unix منذ عقود. على وجه الخصوص ، يمكن للبرامج التفاعل مع بعضها البعض ، وإرسال دفق البيانات باستخدام خطوط الأنابيب (باستخدام حرف الأنبوب - | ).

إذا تصورنا ، على سبيل المثال ، قراءة ملف دون استخدام التدفقات ، فعند تنفيذ الأمر المقابل ، سيتم قراءة محتويات الملف بالكامل في الذاكرة ، وبعد ذلك سيكون من الممكن العمل مع هذه المحتويات.

بفضل استخدام آلية التدفق ، يمكن قراءة الملفات ومعالجتها في أجزاء ، مما يلغي الحاجة إلى تخزين كميات كبيرة من البيانات في الذاكرة.

وحدة دفق Node.js هي الأساس الذي يتم بناء جميع واجهات برمجة التطبيقات التي تدعم الدفق.

Strengthحول نقاط القوة في استخدام التدفقات


تتمتع التدفقات ، بالمقارنة مع الطرق الأخرى لمعالجة البيانات ، بالمزايا التالية:

  • الاستخدام الفعال للذاكرة. لا يعني العمل مع دفق تخزين كميات كبيرة من البيانات التي تم تحميلها هناك في الذاكرة مسبقًا ، قبل أن يصبح من الممكن معالجتها.
  • توفير الوقت. يمكن معالجة البيانات المستلمة من الدفق بشكل أسرع بكثير من الوقت الذي يتعين عليك فيه الانتظار حتى يتم تحميلها بالكامل لبدء معالجتها.

▍ مثال للعمل مع الجداول


يوضح المثال التقليدي للعمل مع التدفقات قراءة ملف من القرص.

أولاً ، ضع في اعتبارك التعليمات البرمجية التي لا يتم استخدام سلاسل الرسائل فيها. تسمح لك وحدة Node.js fs القياسية بقراءة ملف ، وبعد ذلك يمكن نقله عبر HTTP استجابة لطلب تم تلقيه بواسطة خادم HTTP:

 const http = require('http') const fs = require('fs') const server = http.createServer(function (req, res) { fs.readFile(__dirname + '/data.txt', (err, data) => {   res.end(data) }) }) server.listen(3000) 

تتيح لك طريقة readFile() المستخدمة هنا قراءة الملف بأكمله. عندما تكتمل القراءة ، تستدعي رد الاتصال المقابل.

res.end(data) طريقة res.end(data) ، التي يتم استدعاؤها في رد الاتصال ، محتويات الملف إلى العميل.

إذا كان حجم الملف كبيرًا ، فستستغرق هذه العملية الكثير من الوقت. إليك نفس المثال الذي أعيدت كتابته باستخدام التدفقات:

 const http = require('http') const fs = require('fs') const server = http.createServer((req, res) => { const stream = fs.createReadStream(__dirname + '/data.txt') stream.pipe(res) }) server.listen(3000) 

بدلاً من انتظار اللحظة التي تتم فيها قراءة الملف بالكامل ، نبدأ في نقل بياناته إلى العميل فورًا بعد أن يصبح الجزء الأول من هذه البيانات جاهزًا للإرسال.

ipeطريقة الأنابيب ()


في المثال السابق ، استخدمنا بناء النموذج stream.pipe(res) ، والذي يُسمى فيه أسلوب دفق ملف pipe() . تأخذ هذه الطريقة البيانات من مصدرها وترسلها إلى الوجهة.

يتم استدعاؤه لتيار يمثل مصدر بيانات. في هذه الحالة ، هذا هو دفق الملف الذي يتم إرساله إلى استجابة HTTP.

القيمة pipe() لطريقة pipe() هي الدفق الهدف. هذا مريح للغاية ، لأنه يسمح لك بربط عدة مكالمات بطريقة pipe() :

 src.pipe(dest1).pipe(dest2) 

هذا يعادل هذا التصميم:

 src.pipe(dest1) dest1.pipe(dest2) 

odeAPI Node.js التي تستخدم التدفقات


تعد التدفقات آلية مفيدة ؛ ونتيجة لذلك ، توفر العديد من وحدات نواة Node.js إمكانات قياسية للعمل مع التدفقات. ندرج بعضها:

  • process.stdin - إرجاع مؤشر ترابط متصل بـ stdin .
  • process.stdout - إرجاع الخيط المتصل بـ stdout .
  • process.stderr - إرجاع سلسلة متصلة بـ stderr .
  • fs.createReadStream() - إنشاء دفق قابل للقراءة للعمل مع ملف.
  • fs.createWriteStream() - إنشاء دفق قابل للكتابة للعمل مع ملف.
  • net.connect() - يبدأ اتصالاً قائمًا على الدفق.
  • http.request() - إرجاع مثيل لفئة http.ClientRequest التي توفر الوصول إلى الدفق الجاري كتابته.
  • zlib.createGzip() - يضغط البيانات باستخدام خوارزمية gzip ويرسلها إلى الدفق.
  • zlib.createGunzip() - zlib.createGunzip() ضغط تيار gzip .
  • zlib.createDeflate() - يضغط البيانات باستخدام خوارزمية deflate ويرسلها إلى الدفق.
  • zlib.createInflate() - يقوم zlib.createInflate() ضغط تيار deflate .

types أنواع مختلفة من الجداول


هناك أربعة أنواع من الجداول:

  • الدفق القابل للقراءة هو دفق يمكن قراءة البيانات منه. لا يمكنك كتابة البيانات لمثل هذا الدفق. عندما تصل البيانات في مثل هذا التدفق ، يتم تخزينها مؤقتًا حتى يبدأ مستهلك البيانات في قراءتها.
  • دفق للكتابة ( Writable ) هو دفق يمكنك إرسال البيانات فيه. لا يمكنك قراءة البيانات منه.
  • دفق مزدوج ( Duplex ) - في هذا الدفق يمكنك إرسال البيانات وقراءتها منها. أساسا هذا هو مزيج من دفق للقراءة ودفق للكتابة.
  • تيار التحويل ( Transform ) - تشبه هذه التدفقات تيارات مزدوجة ، والفرق هو أن ما يأتي إلى إدخال هذه التدفقات سيغير ما يمكن قراءته منها.

a إنشاء دفق قراءة


, stream :

 const Stream = require('stream') const readableStream = new Stream.Readable() 

, :

 readableStream.push('hi!') readableStream.push('ho!') 


Writable _write() . :

 const Stream = require('stream') const writableStream = new Stream.Writable() 

_write() :

 writableStream._write = (chunk, encoding, next) => {   console.log(chunk.toString())   next() } 

, :

 process.stdin.pipe(writableStream) 


, , :

 const Stream = require('stream') const readableStream = new Stream.Readable() const writableStream = new Stream.Writable() writableStream._write = (chunk, encoding, next) => {   console.log(chunk.toString())   next() } readableStream.pipe(writableStream) readableStream.push('hi!') readableStream.push('ho!') readableStream.push(null) 

readableStream.push(null) .

, readable :

 readableStream.on('readable', () => { console.log(readableStream.read()) }) 


write() :

 writableStream.write('hey!\n') 

▍ ,


, , end() :

 writableStream.end() 

. , , .

MySQL Node.js


MySQL . Node.js , MySQL-, — , .

mysqljs/mysql . , , 12000 GitHub. , MySQL-.


:

 npm install mysql 


:

 const mysql = require('mysql') 

:

 const options = { user: 'the_mysql_user_name', password: 'the_mysql_user_password', database: 'the_mysql_database_name' } const connection = mysql.createConnection(options) 

:

 connection.connect(err => { if (err) {   console.error('An error occurred while connecting to the DB')   throw err } } 


options :

 const options = { user: 'the_mysql_user_name', password: 'the_mysql_user_password', database: 'the_mysql_database_name' } 

. — :

  • host — , MySQL-, — localhost .
  • port — , — 3306 .
  • socketPath — Unix .
  • debug — , .
  • trace — , .
  • ssl — SSL- .

▍ SELECT


SQL- . query , . — , . . :

 connection.query('SELECT * FROM todos', (error, todos, fields) => { if (error) {   console.error('An error occurred while executing the query')   throw error } console.log(todos) }) 

, :

 const id = 223 connection.query('SELECT * FROM todos WHERE id = ?', [id], (error, todos, fields) => { if (error) {   console.error('An error occurred while executing the query')   throw error } console.log(todos) }) 

, , :

 const id = 223 const author = 'Flavio' connection.query('SELECT * FROM todos WHERE id = ? AND author = ?', [id, author], (error, todos, fields) => { if (error) {   console.error('An error occurred while executing the query')   throw error } console.log(todos) }) 

▍ INSERT


INSERT . , :

 const todo = { thing: 'Buy the milk' author: 'Flavio' } connection.query('INSERT INTO todos SET ?', todo, (error, results, fields) => { if (error) {   console.error('An error occurred while executing the query')   throw error } }) 

, , auto_increment , results.insertId :

 const todo = { thing: 'Buy the milk' author: 'Flavio' } connection.query('INSERT INTO todos SET ?', todo, (error, results, fields) => { if (error) {   console.error('An error occurred while executing the query')   throw error }} const id = results.resultId console.log(id) ) 


end() :

 connection.end() 

.

-


Node.js -.

Node.js . , -, NODE_ENV :

 NODE_ENV=production 

. Linux, , :

 export NODE_ENV=production 

, , .bash_profile ( Bash), .

, :

 NODE_ENV=production node app.js 

Node.js. NODE_ENV production :

  • .
  • .

, Pug — , Express, , NODE_ENV production . Express, , . - . .

Express . , , NODE_ENV :

 app.configure('development', () => { //... }) app.configure('production', () => { //... }) app.configure('production', 'staging', () => { //... }) 

, :

 app.configure('development', () => { app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); }) app.configure('production', () => { app.use(express.errorHandler()) }) 


, , Node.js , . , , , Node.js, - , Node.js.

أعزائي القراء! , Node.js, , .

Source: https://habr.com/ru/post/ar425667/


All Articles