Materi ini menyimpulkan seri terjemahan manual Node.js. Hari ini kita akan berbicara tentang os, acara, dan modul http, membahas bekerja dengan aliran dan basis data, dan membahas penggunaan Node.js dalam pengembangan dan produksi aplikasi.

[Kami menyarankan Anda untuk membaca] Bagian lain dari siklus iniBagian 1:
Informasi Umum dan MemulaiBagian 2:
JavaScript, V8, beberapa trik pengembanganBagian 3:
Hosting, REPL, bekerja dengan konsol, modulBagian 4:
npm, package.json dan file package-lock.jsonBagian 5:
npm dan npxBagian 6:
loop acara, tumpukan panggilan, timerBagian 7:
Pemrograman AsinkronBagian 8:
Protokol HTTP dan WebSocketBagian 9:
bekerja dengan sistem fileBagian 10:
modul standar, utas, basis data, NODE_ENVPDF lengkap dari Node.js Guide Modul os Node.js
Modul
os
menyediakan akses ke banyak fungsi yang dapat digunakan untuk memperoleh informasi tentang sistem operasi dan perangkat keras komputer yang menjalankan Node.js. Ini adalah modul standar, Anda tidak perlu menginstalnya, untuk bekerja dengannya dari kode, cukup sambungkan:
const os = require('os')
Ada beberapa properti berguna di sini, yang, khususnya, mungkin berguna ketika bekerja dengan file.
Jadi, properti
os.EOL
memungkinkan
os.EOL
untuk mengetahui pemisah garis yang digunakan dalam sistem (sebuah
os.EOL
garis). Di Linux dan macOS, ini
\n
, di Windows,
\r\n
.
Perlu dicatat bahwa ketika kita menyebutkan "Linux dan macOS" di sini, kita berbicara tentang platform yang kompatibel dengan POSIX. Demi singkatnya, kami tidak menyebutkan platform yang kurang populer di sini.
Properti
os.constants.signals
menyediakan informasi tentang konstanta yang digunakan untuk memproses sinyal proses seperti
SIGHUP
,
SIGKILL
, dan sebagainya.
Di sini Anda dapat menemukan detail tentang mereka.
Properti
os.constants.errno
berisi konstanta yang digunakan untuk pesan kesalahan - seperti
EADDRINUSE
,
EOVERFLOW
.
Sekarang pertimbangkan metode utama modul
os
.
▍os.arch ()
Metode ini mengembalikan string yang mengidentifikasi arsitektur sistem, misalnya,
arm
,
x64
,
arm64
.
▍os.cpus ()
Mengembalikan informasi tentang prosesor yang tersedia di sistem. Misalnya, informasi ini mungkin terlihat seperti ini:
[ { 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 ()
Mengembalikan
BE
atau
LE
tergantung pada
urutan byte apa (Big Engian atau Little Endian) digunakan untuk mengkompilasi file biner Node.js.
▍os.freemem ()
Mengembalikan jumlah memori sistem bebas dalam byte.
▍os.homedir ()
Mengembalikan jalur ke direktori home dari pengguna saat ini. Misalnya,
'/Users/flavio'
.
▍os.hostname ()
Mengembalikan nama host.
▍os.loadavg ()
Mengembalikan, dalam sebuah array, rata-rata memuat data yang dihitung oleh sistem operasi. Informasi ini hanya masuk akal di Linux dan macOS. Ini bisa terlihat seperti ini:
[ 3.68798828125, 4.00244140625, 11.1181640625 ]
▍os.networkInterfaces ()
Mengembalikan informasi tentang antarmuka jaringan yang tersedia di sistem. Sebagai contoh:
{ 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 ()
Mengembalikan informasi tentang platform yang dikompilasi Node.js. Berikut adalah beberapa nilai pengembalian yang mungkin:
- darwin
- freebsd
- linux
- openbsd
- win32
▍os.release ()
Mengembalikan string yang mengidentifikasi nomor rilis sistem operasi.
▍os.tmpdir ()
Mengembalikan jalur ke direktori yang ditentukan dalam sistem untuk menyimpan file sementara.
▍os.totalmem ()
Mengembalikan jumlah total memori sistem dalam byte.
▍os.type ()
Mengembalikan informasi yang mengidentifikasi sistem operasi. Sebagai contoh:
Linux
- Linux.Darwin
- macOS.Windows_NT
- Windows.
▍os.uptime ()
Mengembalikan waktu aktif sistem dalam detik sejak reboot terakhir.
Modul acara Node.js
Modul
events
memberi kita kelas
EventEmitter
, yang dirancang untuk bekerja dengan acara di platform Node.js. Kami sudah berbicara sedikit tentang modul ini pada seri materi
ketujuh ini.
Ini dokumentasi untuknya. Di sini kita melihat API modul ini. Ingatlah bahwa untuk menggunakannya dalam kode Anda perlu menghubungkannya, seperti biasanya dengan modul standar. Setelah itu, Anda perlu membuat objek
EventEmitter
baru. Ini terlihat seperti ini:
const EventEmitter = require('events') const door = new EventEmitter()
Objek dari kelas
EventEmitter
menggunakan mekanisme standar, khususnya, peristiwa berikut:
newListener
- acara ini newListener
ketika event handler ditambahkan.removeListener
- dipanggil saat pawang dihapus.
Pertimbangkan metode objek yang paling berguna dari kelas
EventEmitter
(objek serupa dalam nama metode ditunjukkan sebagai
emitter
).
▍emitter.addListener ()
Alias untuk metode
emitter.on()
.
▍emitter.emit ()
Menghasilkan suatu acara. Meminta semua penangan acara secara sinkron sesuai urutan pendaftarannya.
▍emitter.eventNames ()
Mengembalikan array yang berisi acara yang terdaftar.
▍emitter.getMaxListeners ()
Mengembalikan jumlah maksimum penangan yang dapat ditambahkan ke objek dari kelas
EventEmitter
. Standarnya adalah 10. Jika perlu, parameter ini dapat ditambah atau dikurangi menggunakan metode
setMaxListeners()
.
▍emitter.listenerCount ()
Mengembalikan jumlah penangan acara yang namanya diteruskan ke metode ini sebagai parameter:
door.listenerCount('open')
▍emitter.listeners ()
Mengembalikan array penangan acara untuk acara yang sesuai, yang namanya diteruskan ke metode ini:
door.listeners('open')
▍emitter.off ()
Alias untuk metode
emitter.removeListener()
, diperkenalkan pada Node 10.
▍emitter.on ()
Daftarkan panggilan balik yang dipanggil saat suatu peristiwa dihasilkan. Berikut cara menggunakannya:
door.on('open', () => { console.log('Door was opened') })
▍emitter.once ()
Ia mendaftarkan panggilan balik yang hanya dipanggil sekali - pada kejadian pertama dari suatu peristiwa untuk mana panggilan balik ini didaftarkan. Sebagai contoh:
const EventEmitter = require('events') const ee = new EventEmitter() ee.once('my-event', () => {
▍emitter.prependListener ()
Saat mendaftarkan pawang menggunakan metode
on()
atau
addListener()
, pawang ini ditambahkan ke akhir antrian pawang dan dipanggil terakhir untuk menangani acara terkait. Saat menggunakan metode
prependListener()
, pawang ditambahkan ke bagian depan antrian, yang menyebabkannya dipanggil terlebih dahulu untuk memproses acara.
▍emitter.prependOnceListener ()
Metode ini mirip dengan yang sebelumnya. Yaitu, ketika seorang penangan yang ditujukan untuk satu panggilan terdaftar menggunakan metode
once()
, itu ternyata menjadi yang terakhir dalam antrian penangan dan yang terakhir dipanggil. Metode
prependOnceListener()
memungkinkan Anda untuk menambahkan handler ke depan antrian.
▍emitter.removeAllListeners ()
Metode ini menghapus semua penangan untuk peristiwa tertentu yang terdaftar di objek yang sesuai. Mereka menggunakannya seperti ini:
door.removeAllListeners('open')
▍emitter.removeListener ()
Menghapus handler yang ditentukan untuk diteruskan ke metode ini. Untuk menyimpan penangan untuk penghapusan selanjutnya, panggilan balik yang sesuai dapat ditugaskan ke variabel. Ini terlihat seperti ini:
const doSomething = () => {} door.on('open', doSomething) door.removeListener('open', doSomething)
▍emitter.setMaxListeners ()
Metode ini memungkinkan Anda untuk menentukan jumlah penangan maksimum yang dapat ditambahkan ke satu peristiwa dalam instance kelas
EventEmitter
. Secara default, seperti yang telah disebutkan, Anda dapat menambahkan hingga 10 penangan untuk acara tertentu. Nilai ini bisa diubah. Gunakan metode ini sebagai berikut:
door.setMaxListeners(50)
Modul Node.js http
Pada bagian
kedelapan dari seri bahan ini, kita telah berbicara tentang modul
http
Node.js standar. Dia menerapkan mekanisme pengembang yang dirancang untuk membuat server HTTP. Ini adalah modul utama yang digunakan untuk menyelesaikan masalah pertukaran data melalui jaringan di Node.js. Anda dapat menghubungkannya dalam kode seperti ini:
const http = require('http')
Ini terdiri dari properti, metode, dan kelas. Mari kita bicarakan mereka.
▍Properti
http.METHODS
Properti ini mencantumkan semua metode HTTP yang didukung:
> 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
Ini berisi kode status HTTP dan deskripsinya:
> 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
Properti ini menunjuk ke instance global dari kelas
http.Agent
. Ini digunakan untuk mengelola koneksi. Ini dapat dianggap sebagai komponen kunci dari subsistem HTTP Node.js. Kita akan berbicara lebih banyak tentang kelas
http.Agent
bawah ini.
EtMetode
http.createServer ()
Mengembalikan instance baru dari kelas
http.Server
. Berikut cara menggunakan metode ini untuk membuat server HTTP:
const server = http.createServer((req, res) => {
http.request ()
Memungkinkan Anda membuat permintaan HTTP ke server dengan membuat turunan dari kelas
http.ClientRequest
.
http.get ()
Metode ini mirip dengan
http.request()
, tetapi secara otomatis mengatur metode HTTP ke
GET
dan secara otomatis memanggil perintah dari form
req.end()
.
▍ Kelas
Modul HTTP menyediakan 5 kelas -
Agent
,
ClientRequest
,
Server
,
ServerResponse
dan
IncomingMessage
. Pertimbangkan mereka.
http.Agent
Instance global dari kelas
http.Agent
dibuat oleh Node.js digunakan untuk mengelola koneksi. Ini digunakan sebagai nilai default untuk semua permintaan HTTP dan menyediakan antrian dan penggunaan kembali soket. Selain itu, ia mendukung kumpulan soket, yang memungkinkan kinerja tinggi dari subsistem jaringan Node.js. Jika perlu, Anda bisa membuat objek
http.Agent
Anda sendiri.
http.ClientRequest
Objek kelas
http.ClientRequest
, yang merupakan permintaan yang sedang berjalan, dibuat ketika metode
http.request()
atau
http.get()
dipanggil. Ketika respons terhadap permintaan diterima, peristiwa respons dimunculkan, di mana respons dikirimkan - sebuah instance dari
http.IncomingMessage
. Data yang diperoleh setelah permintaan selesai dapat diproses dengan dua cara:
- Anda dapat memanggil metode
response.read()
. - Di penangan peristiwa
response
, Anda bisa mengonfigurasi pendengar untuk peristiwa data
, yang memungkinkan Anda bekerja dengan streaming data.
http. server
Contoh kelas ini digunakan untuk membuat server menggunakan perintah
http.createServer()
. Setelah kita memiliki objek server, kita dapat menggunakan metode-metodenya:
- Metode
listen()
digunakan untuk memulai server dan mengatur menunggu dan memproses permintaan yang masuk. - Metode
close()
menghentikan server.
http.ServerResponse
Objek ini dibuat oleh kelas
http.Server
dan diteruskan sebagai parameter kedua ke acara
request
saat itu terjadi. Biasanya, objek-objek tersebut dalam kode diberi nama
res
:
const server = http.createServer((req, res) => {
Dalam penangan seperti itu, setelah respons server siap dikirim ke klien, metode
end()
dipanggil, yang melengkapi respons. Metode ini harus dipanggil setelah penyelesaian setiap respons.
Berikut adalah metode yang digunakan untuk bekerja dengan tajuk HTTP:
getHeaderNames()
- mengembalikan daftar nama header yang diinstal.getHeaders()
- mengembalikan salinan header HTTP yang ditetapkan.setHeader('headername', value)
- menetapkan nilai untuk header yang ditentukan.getHeader('headername')
- mengembalikan header yang ditetapkan.removeHeader('headername')
- menghapus header yang diinstal.hasHeader('headername')
- mengembalikan true
jika respons sudah memiliki header yang namanya diteruskan ke metode ini.headersSent()
- mengembalikan true
jika header sudah dikirim ke klien.
Setelah memproses header, mereka dapat dikirim ke klien dengan memanggil metode
response.writeHead()
, yang, sebagai parameter pertama, mengambil kode status. Sebagai parameter kedua dan ketiga, sebuah pesan yang sesuai dengan kode status dan header dapat diteruskan ke sana.
Untuk mengirim data ke klien, metode
write()
digunakan di badan respons. Ia mengirim data yang disangga ke aliran respons HTTP.
Jika tajuk belum diatur dengan perintah
response.writeHead()
, tajuk dengan kode status dan pesan yang ditentukan dalam permintaan akan dikirim terlebih dahulu. Anda dapat mengatur nilainya dengan menetapkan nilai untuk
statusCode
dan
statusMessage
:
response.statusCode = 500 response.statusMessage =
http.IncomingMessage
Objek kelas
http.IncomingMessage
dibuat dalam rangka mekanisme berikut ini:
http.Server
- saat memproses acara request
.http.ClientRequest
- saat menangani acara response
.
Ini dapat digunakan untuk bekerja dengan data respons. Yaitu:
- Untuk mengetahui kode status respons dan pesan yang sesuai, digunakan
statusCode
dan statusMessage
. - Anda bisa melihat
headers
respons headers
rawHearders
headers
atau rawHearders
(untuk daftar header mentah). - Anda dapat mengetahui metode permintaan menggunakan properti
method
. - Untuk mengetahui versi HTTP yang digunakan, gunakan properti
httpVersion
. - Properti url digunakan untuk mendapatkan URL.
- Properti
socket
memungkinkan Anda untuk mendapatkan objek net.Socket
terkait dengan koneksi.
Data respons disajikan sebagai aliran sejak objek
http.IncomingMessage
mengimplementasikan antarmuka
Readable Stream
.
Bekerja dengan stream di Node.js
Utas adalah salah satu konsep dasar yang digunakan dalam aplikasi Node.js. Streaming adalah alat yang memungkinkan Anda untuk membaca dan menulis file, mengatur interaksi jaringan antar sistem, dan, secara umum, secara efektif mengimplementasikan operasi pertukaran data.
Konsep utas tidak unik untuk Node.js. Mereka muncul di keluarga OS Unix beberapa dekade yang lalu. Secara khusus, program dapat berinteraksi satu sama lain, mentransmisikan aliran data menggunakan jalur pipa (menggunakan karakter pipa -
|
).
Jika kita bayangkan, katakanlah, membaca file tanpa menggunakan stream, maka, selama pelaksanaan perintah yang sesuai, isi file akan sepenuhnya dibaca ke dalam memori, setelah itu akan mungkin untuk bekerja dengan konten ini.
Berkat penggunaan mekanisme aliran, file dapat dibaca dan diproses di bagian-bagian, yang menghilangkan kebutuhan untuk menyimpan sejumlah besar data dalam memori.
Modul
aliran Node.js adalah fondasi di mana semua API yang mendukung streaming dibangun.
▍Tentang Kekuatan Menggunakan Streaming
Streaming, dibandingkan dengan metode pemrosesan data lainnya, memiliki keunggulan berikut:
- Penggunaan memori yang efisien. Bekerja dengan aliran tidak berarti menyimpan dalam memori sejumlah besar data yang dimuat di sana terlebih dahulu, sebelum dimungkinkan untuk memprosesnya.
- Hemat waktu. Data yang diterima dari aliran dapat diproses lebih cepat daripada ketika Anda harus menunggu mereka untuk dimuat sepenuhnya untuk mulai memprosesnya.
▍ Contoh pekerjaan dengan stream
Contoh tradisional bekerja dengan stream menunjukkan membaca file dari disk.
Pertama, pertimbangkan kode di mana utas tidak digunakan. Modul Node.js
fs
standar memungkinkan Anda membaca file, setelah itu dapat ditransfer melalui HTTP sebagai tanggapan atas permintaan yang diterima oleh server 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)
Metode
readFile()
yang digunakan di sini memungkinkan Anda membaca seluruh file. Ketika pembacaan selesai, ia memanggil panggilan balik yang sesuai.
Metode
res.end(data)
, dipanggil dalam panggilan balik, mengirimkan konten file ke klien.
Jika ukuran file besar, maka operasi ini akan memakan banyak waktu. Berikut adalah contoh yang sama yang ditulis ulang menggunakan stream:
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)
Alih-alih menunggu saat file sepenuhnya dibaca, kami mulai mentransfer datanya ke klien segera setelah bagian pertama dari data ini siap dikirim.
Metode ipePipe ()
Pada contoh sebelumnya, kami menggunakan konstruksi form
stream.pipe(res)
, di mana metode stream file
pipe()
dipanggil. Metode ini mengambil data dari sumbernya dan mengirimkannya ke tujuan.
Itu disebut aliran yang mewakili sumber data. Dalam hal ini, ini adalah aliran file yang dikirim ke respons HTTP.
Nilai kembali metode
pipe()
adalah aliran target. Ini sangat mudah, karena memungkinkan Anda untuk menghubungkan beberapa panggilan ke metode
pipe()
:
src.pipe(dest1).pipe(dest2)
Ini setara dengan desain seperti itu:
src.pipe(dest1) dest1.pipe(dest2)
▍API Node.js yang menggunakan stream
Streaming adalah mekanisme yang berguna, sebagai hasilnya, banyak modul dari kernel Node.js menyediakan kemampuan standar untuk bekerja dengan stream. Kami mencantumkan beberapa di antaranya:
process.stdin
- mengembalikan utas yang terhubung ke stdin
.process.stdout
- Mengembalikan utas yang terhubung ke stdout
.process.stderr
- mengembalikan utas yang terhubung ke stderr
.fs.createReadStream()
- membuat aliran yang dapat dibaca untuk bekerja dengan file.fs.createWriteStream()
- membuat aliran yang dapat ditulis untuk bekerja dengan file.net.connect()
- memulai koneksi berbasis aliran.http.request()
- mengembalikan turunan dari kelas http.ClientRequest
yang menyediakan akses ke aliran yang sedang ditulis.zlib.createGzip()
- kompres data menggunakan algoritma gzip
dan mengirimkannya ke stream.zlib.createGunzip()
- mendekompres aliran gzip
.zlib.createDeflate()
- kompres data menggunakan algoritma deflate
dan mengirimkannya ke stream.zlib.createInflate()
- mendekompres aliran deflate
.
▍ Berbagai jenis aliran
Ada empat jenis aliran:
- Aliran yang dapat dibaca adalah aliran dari mana data dapat dibaca. Anda tidak dapat menulis data ke aliran seperti itu. Ketika data tiba dalam aliran seperti itu, buffered sampai konsumen data mulai membacanya.
- Aliran untuk menulis (
Writable
) adalah aliran di mana Anda dapat mengirim data. Anda tidak dapat membaca data darinya. - Duplex stream (
Duplex
) - dalam aliran ini Anda dapat mengirim data dan membacanya. Pada dasarnya ini adalah kombinasi dari aliran untuk membaca dan aliran untuk menulis. - Transform stream (
Transform
) - aliran tersebut mirip dengan aliran dupleks, perbedaannya adalah apa yang datang ke input aliran ini akan mengubah apa yang dapat dibaca dari aliran tersebut.
▍Buat aliran baca
,
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, , .
