تختتم هذه المادة بسلسلة 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) => {
في مثل هذه المعالجات ، بعد أن تكون استجابة الخادم جاهزة للإرسال إلى العميل ، يتم استدعاء الأسلوب
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 =
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, , .
