


Penjelasan terperinci tentang mencipta dan mengurus proses luaran dalam Node.js_node.js
Nod direka bentuk untuk mengendalikan operasi I/O dengan cekap, tetapi anda harus sedar bahawa beberapa jenis atur cara tidak sesuai untuk model ini. Sebagai contoh, jika anda bercadang untuk menggunakan Node untuk mengendalikan tugas intensif CPU, anda boleh menyumbat gelung acara dan oleh itu mengurangkan responsif program. Alternatifnya adalah untuk memuatkan tugas intensif CPU ke proses yang berasingan, dengan itu membebaskan gelung acara. Node membolehkan anda melahirkan proses dan menjadikan proses baharu sebagai anak kepada induknya. Dalam Node, proses anak boleh berkomunikasi dengan proses induk secara dua hala, dan pada tahap tertentu, proses induk juga boleh memantau dan mengurus proses anak.
Situasi lain di mana anda perlu menggunakan subproses ialah apabila anda hanya mahu melaksanakan arahan luaran dan biarkan Node mendapat nilai pulangan arahan itu. Sebagai contoh, anda boleh melaksanakan perintah UNIX, skrip atau arahan lain yang tidak boleh dilaksanakan secara langsung dalam Node.
Bab ini akan menunjukkan kepada anda cara melaksanakan perintah luaran, mencipta dan berkomunikasi dengan proses anak dan menamatkan proses anak. Intinya adalah untuk membolehkan anda memahami cara menyelesaikan satu siri tugasan di luar proses Node.
Laksanakan arahan luaran
Apabila anda perlu melaksanakan perintah shell luaran atau fail boleh laku, anda boleh menggunakan modul child_process dan mengimportnya seperti ini:
var child_process = memerlukan('child_process')
Kemudian anda boleh menggunakan fungsi exec dalam modul untuk melaksanakan arahan luaran:
var exec = child_process.exec;
exec(arahan,panggil balik);
Parameter pertama exec ialah rentetan perintah shell yang anda ingin laksanakan, dan parameter kedua ialah fungsi panggil balik. Fungsi panggil balik ini akan dipanggil apabila exec selesai melaksanakan arahan luaran atau ralat berlaku. Fungsi panggil balik mempunyai tiga parameter: ralat, stdout, stderr, lihat contoh berikut:
exec('ls',function(err,stdout,stderr){
// Nota penterjemah: Jika anda menggunakan windows, anda boleh menukar kepada perintah windows, seperti dir, yang tidak akan diterangkan lagi
});
Jika ralat berlaku, parameter pertama akan menjadi contoh kelas Ralat Jika parameter pertama tidak mengandungi ralat, maka parameter kedua stdout akan mengandungi output standard arahan. Parameter terakhir mengandungi output ralat yang berkaitan dengan arahan.
Penyenaraian 8-1 menunjukkan contoh yang lebih kompleks untuk melaksanakan perintah luaran
PENYENARAIAN 8-1: Laksanakan arahan luaran (kod sumber: chapter8/01_external_command.js)
//Import fungsi exec modul child_process
var exec = memerlukan(‘proses_anak’).exec;
//Panggil perintah "cat *.js | wc -l"
exec(‘cat *.js | wc –l ‘, function(err, stdout, stderr ){ //Baris keempat
//Arahan keluar atau panggilan gagal
Jika(err){
//Gagal memulakan proses luaran
console.log(‘child_process keluar, kod ralat ialah: ',err.code);
kembali;
}
}
Pada baris keempat, kami lulus "cat *.js | wc -l" sebagai parameter pertama untuk melaksanakan Anda juga boleh mencuba mana-mana arahan lain, selagi anda telah menggunakan arahan dalam shell.
Kemudian lulus fungsi panggil balik sebagai parameter kedua, yang akan dipanggil apabila ralat berlaku atau proses anak ditamatkan.
Anda juga boleh menghantar parameter pilihan ketiga sebelum fungsi panggil balik, yang mengandungi beberapa pilihan konfigurasi, seperti:
var exec = memerlukan('proses_anak').exec; pilihan var ={
Tamat masa: 1000,
killSignal: ‘SIGKILL’
};
//…
});
1.cwd - Direktori semasa, anda boleh menentukan direktori kerja semasa.
2.pengekodan - format pengekodan kandungan output proses anak Nilai lalai ialah "utf8", iaitu pengekodan UTF-8. Jika output proses anak bukan utf8, anda boleh menggunakan parameter ini untuk menetapkannya Format pengekodan yang disokong ialah:
utf8
ucs2
asas64
Gunakan Penampan untuk memproses, mengekod dan menyahkod data binari".
1.masa tamat - tamat masa pelaksanaan perintah dalam milisaat, lalai ialah 0, yang bermaksud tiada had, sehingga proses anak tamat.
2.maxBuffer - Tentukan bilangan maksimum bait yang dibenarkan untuk dikeluarkan oleh aliran stdout dan aliran stderr Jika nilai maksimum dicapai, proses anak akan dimatikan. Nilai lalai ialah 200*1024.
3.killSignal - Isyarat penamatan dihantar kepada proses anak apabila tamat masa atau penimbal output mencapai saiz maksimumnya. Nilai lalai ialah "SIGTERM", yang akan menghantar isyarat penamatan kepada proses anak. Pendekatan teratur ini biasanya digunakan untuk menamatkan proses. Apabila menggunakan isyarat SIGTERM, proses boleh memprosesnya atau mengatasi kelakuan lalai pemproses isyarat selepas menerimanya. Jika proses sasaran memerlukannya, anda boleh menghantar isyarat lain (seperti SIGUSR1) kepadanya pada masa yang sama. Anda juga boleh memilih untuk menghantar isyarat SIGKILL, yang akan diproses oleh sistem pengendalian dan memaksa proses kanak-kanak ditamatkan serta-merta Dalam kes ini, sebarang operasi pembersihan proses kanak-kanak tidak akan dilakukan.
1.evn - Menentukan pembolehubah persekitaran yang dihantar kepada proses anak Lalai adalah batal, yang bermaksud bahawa proses anak akan mewarisi pembolehubah persekitaran semua proses induk sebelum ia dibuat.
Nota: Menggunakan pilihan killSignal, anda boleh menghantar isyarat kepada proses sasaran dalam bentuk rentetan. Isyarat wujud dalam bentuk rentetan dalam Node Berikut ialah senarai isyarat UNIX dan operasi lalai yang sepadan:
PENYENARAIAN 8-2: Gunakan pembolehubah persekitaran berparameter untuk melaksanakan arahan (kod sumber: chapter8/02_env_vars_augment.js)
varName,
envCopy = {},
exec = memerlukan(‘child_prcess’).exec;
//Salin process.env ke envCopy
untuk(vaName dalam ev){
envCopy[varName] = env[varName];
}
//Tetapkan beberapa pembolehubah tersuai
envCopy['CUSTOM ENV VAR1'] = 'sesetengah nilai';
envCopy['CUSTOM ENV VAR2'] = 'beberapa nilai lain';
exec(‘ls –la’,{env: envCopy}, function(err,stdout,stderr){
If(err){ throw err;
console.log(‘stdout:’, stdout);
console.log(‘stderr:’,stderr);
}
Contoh di atas mencipta pembolehubah envCopy untuk menyimpan pembolehubah persekitaran Ia mula-mula menyalin pembolehubah persekitaran proses Node daripada process.env, kemudian menambah atau menggantikan beberapa pembolehubah persekitaran yang perlu diubah suai, dan akhirnya menggunakan envCopy sebagai persekitaran. . Argumen pembolehubah dihantar ke fungsi exec dan arahan luaran dilaksanakan.
Ingat bahawa pembolehubah persekitaran dihantar antara proses melalui sistem pengendalian, dan semua jenis nilai pembolehubah persekitaranmencapai proses anak dalam bentuk rentetan. Sebagai contoh, jika proses induk mengandungi nombor 123 sebagai pembolehubah persekitaran, proses anak akan menerima "123" sebagai rentetan.
Contoh berikut akan membuat dua skrip Node dalam direktori yang sama: parent.js dan child.js. Skrip pertama akan memanggil yang kedua Mari buat dua fail ini:
PENYENARAIAN 8-3: Proses induk menetapkan pembolehubah persekitaran (bab8/03_environment_number_parent.js)
var exec = memerlukan('proses_anak').exec;
exec('node child.js', {env: {nombor: 123}}, function(err, stdout, stderr) {
jika (err) { membuang err;
console.log('stdout:n', stdout);console.log('stderr:n', stderr);
});
Contoh 8-4: Pembolehubah persekitaran penghuraian proses anak (bab8/04_environment_number_child.js)
console.log(typeof(nombor)); // → "rentetan"
nombor = parseInt(nombor, 10);
console.log(typeof(nombor)); // → "nombor"
rentetan
nombor
stderr:
Jana proses anak
Seperti yang anda lihat, anda boleh menggunakan fungsi child_process.exec() untuk memulakan proses luaran dan memanggil fungsi panggil balik anda apabila proses tamat Ini sangat mudah untuk digunakan, tetapi ia juga mempunyai beberapa kelemahan:1 Selain menggunakan parameter baris arahan dan pembolehubah persekitaran, exec() tidak boleh berkomunikasi dengan proses anak
2. Output proses anak dicache, jadi anda tidak boleh menstrimnya, ia mungkin kehabisan memori
Buat proses anak
Anda boleh menggunakan fungsi child_process.spawn untuk mencipta proses anak baharu, lihat Contoh 8-5:Contoh 8-5: Melahirkan proses anak. (bab 8/05_spawning_child.js)
var spawn = memerlukan('child_process').spawn;
// Hasilkan proses anak untuk melaksanakan perintah "tail -f /var/log/system.log"
var child = spawn('tail', ['-f', '/var/log/system.log']);
Kod di atas menjana subproses untuk melaksanakan perintah ekor dan mengambil "-f" dan "/bar/log/system.log" sebagai parameter. Perintah tail akan memantau fail /var/log/system.og (jika wujud) dan mengeluarkan sebarang data baharu yang ditambahkan ke strim output standard stdout. Fungsi spawn mengembalikan objek ChildProcess, yang merupakan objek penunjuk yang merangkum antara muka akses proses sebenar. Dalam contoh ini kami menetapkan deskriptor baharu ini kepada pembolehubah yang dipanggil anak.
Dengar data daripada proses kanak-kanak
Mana-mana pemegang proses anak yang mengandungi atribut stdout akan menggunakan stdout keluaran standard proses anak sebagai objek strim Anda boleh mengikat peristiwa data pada objek strim ini, supaya apabila blok data tersedia, panggilan balik yang sepadan fungsi, lihat contoh di bawah:
//Cetak output proses anak ke konsol
child.stdout.on(‘data’,function(data){
console.log(‘output ekor: ‘ data);
});
Setiap kali proses anak mengeluarkan data ke stdout, proses induk akan dimaklumkan dan mencetak data ke konsol.
Selain output standard, proses ini mempunyai satu lagi strim output lalai: strim ralat standard Strim ini biasanya digunakan untuk mengeluarkan maklumat ralat.
Dalam contoh ini, jika fail /var/log/system.log tidak wujud, proses ekor akan mengeluarkan mesej yang serupa dengan yang berikut: "/var/log/system.log: Tiada fail atau direktori sedemikian" , dengan memantau aliran stderr, proses induk akan dimaklumkan apabila ralat sedemikian berlaku.
Proses induk boleh mendengar aliran ralat standard seperti ini:
child.stderr.on('data', function(data) {
console.log('output ralat ekor:', data);
});
Atribut stderr, seperti stdout, juga merupakan strim baca sahaja Setiap kali anak memproses data kepada strim ralat standard, proses induk akan dimaklumkan dan mengeluarkan data.
Hantar data ke proses anak
Selain menerima data daripada aliran output proses anak, proses induk juga boleh menulis data ke input standard proses anak melalui sifat childPoces.stdin, dengan itu menghantar data ke dan dari proses anak.
Proses anak boleh memantau data input standard melalui strim baca sahaja process.stdin, tetapi ambil perhatian bahawa anda mesti menyambung semula strim input standard terlebih dahulu kerana ia berada dalam keadaan dijeda secara lalai.
Contoh 8-6 akan mencipta program yang mengandungi fungsi berikut:
1. 1 Aplikasi: Aplikasi mudah yang boleh menerima integer daripada input standard, menambahnya, dan kemudian mengeluarkan hasil tambah kepada aliran output standard. Sebagai perkhidmatan pengkomputeran yang mudah, aplikasi ini mensimulasikan proses Node sebagai perkhidmatan luaran yang boleh melaksanakan kerja tertentu.
2. Uji klien 1 aplikasi, hantar integer rawak, dan kemudian keluarkan hasilnya. Digunakan untuk menunjukkan cara proses Node melahirkan proses anak dan kemudian membenarkannya melaksanakan tugas tertentu.
Buat fail bernama plus_one.js menggunakan kod dalam Contoh 8-6 di bawah:
Contoh 8-6: 1 permohonan (bab8/06_plus_one.js)
//Pulihkan strim input standard yang dijeda secara lalai
process.stdin.resume();
process.stdin.on('data', function(data) {
nombor var;
Cuba {
// Menghuraikan data input ke dalam jenis integer
Number = parseInt(data.toString(), 10);
// 1
nombor = 1;
//Hasil keluaran
Process.stdout.write(nombor "n");
} tangkap(err) {
Process.stderr.write(err.message "n");
}
});
Dalam kod di atas, kami menunggu data daripada aliran input standard stdin Apabila data tersedia, kami menganggap ia adalah integer dan menghuraikannya ke dalam pembolehubah integer, kemudian tambah 1 dan keluarkan hasilnya kepada aliran output standard. .
Anda boleh menjalankan program ini dengan arahan berikut:
$ nod plus_one.js
Selepas berjalan, program mula menunggu input Jika anda memasukkan integer dan tekan Enter, anda akan melihat nombor ditambah dengan 1 dipaparkan pada skrin.
Anda boleh keluar dari program dengan menekan Ctrl-C.
Pelanggan ujian
Kini anda perlu mencipta proses Node untuk menggunakan perkhidmatan pengkomputeran yang disediakan oleh "1 aplikasi" sebelumnya.
Mula-mula buat fail bernama plus_one_test.js Kandungan ditunjukkan dalam Contoh 8-7:
Contoh 8-7: Aplikasi Ujian 1 (bab8/07_plus_one_test.js)
var spawn = memerlukan('child_process').spawn;
// Hasilkan proses anak untuk melaksanakan 1 aplikasi
var child = spawn('nod', ['plus_one.js']);
// Panggil fungsi setiap saat
setInterval(function() {
// Cipta nombor rawak yang lebih kecil daripada 10.000
nombor var = Math.floor(Math.random() * 10000);
// Hantar nombor itu kepada proses anak:
child.stdin.write(nombor "n");
// Dapatkan respons daripada proses anak dan cetaknya:
child.stdout.once('data', function(data) {
console.log('anak menjawab ' nombor ' dengan: ' data);
});
}, 1000);
child.stderr.on('data', function(data) {
Process.stdout.write(data);
});
Subproses yang digunakan untuk menjalankan "1 aplikasi" dimulakan dari baris pertama hingga keempat, dan kemudian fungsi setInterval digunakan untuk melaksanakan operasi berikut sekali setiap saat:
1.. Buat nombor rawak baharu kurang daripada 10000
2. Hantar nombor ini sebagai rentetan kepada proses anak
3. Tunggu proses anak membalas dengan rentetan
4. Kerana anda hanya ingin menerima hasil pengiraan 1 nombor pada satu masa, anda perlu menggunakan child.stdout.sekali dan bukannya child.stdout.on. Jika yang terakhir digunakan, fungsi panggil balik untuk peristiwa data akan didaftarkan setiap 1 saat Setiap fungsi panggil balik yang didaftarkan akan dilaksanakan apabila stdout proses anak menerima data, jadi anda akan mendapati bahawa hasil pengiraan yang sama akan dikeluarkan. Banyak kali, tingkah laku ini jelas salah.
Terima pemberitahuan apabila proses anak keluar
Apabila proses anak keluar, acara keluar akan dicetuskan. Contoh 8-8 menunjukkan cara mendengarnya:
Contoh 8-8: Mendengar peristiwa keluar dari proses anak (bab8/09_listen_child_exit.js)
var spawn = memerlukan('child_process').spawn;
// Melahirkan proses anak untuk melaksanakan perintah "ls -la"
var child = spawn('ls', ['-la']);
child.stdout.on('data', function(data) {
console.log('data daripada kanak-kanak: ' data);
});
// Apabila proses anak keluar:
child.on('keluar', fungsi(kod) {
console.log('proses kanak-kanak ditamatkan dengan kod ');
});
Dalam beberapa baris terakhir kod yang dicetak tebal, proses induk menggunakan acara keluar proses anak untuk mendengar acara keluarnya Apabila peristiwa itu berlaku, konsol memaparkan output yang sepadan. Kod keluar proses anak akan dihantar ke fungsi panggil balik sebagai parameter pertama. Sesetengah program menggunakan kod keluar bukan sifar untuk mewakili keadaan kegagalan tertentu. Contohnya, jika anda cuba melaksanakan arahan "ls –al click filename.txt" tetapi fail itu tidak wujud dalam direktori semasa, anda akan mendapat kod keluar 1, lihat Contoh 8-9:
Contoh 8-9: Dapatkan kod keluar proses anak (bab8/10_child_exit_code.js)
var spawn = memerlukan('child_process').spawn;
// Hasilkan proses anak dan laksanakan perintah "ls does_not_exist.txt"
var child = spawn('ls', ['does_not_exist.txt']);
// Apabila proses anak keluar
child.on('keluar', fungsi(kod) {
console.log('proses kanak-kanak ditamatkan dengan kod ');
});
Dalam contoh ini, peristiwa keluar mencetuskan fungsi panggil balik dan menghantar kod keluar proses anak kepadanya sebagai parameter pertama. Jika proses anak keluar secara tidak normal kerana dibunuh oleh isyarat, kod isyarat yang sepadan akan dihantar ke fungsi panggil balik sebagai parameter kedua, seperti Contoh 8-10:
PENYENARAIAN 8-10: Dapatkan isyarat keluar proses anak (bab8/11_child_exit_signal.js)
var spawn = memerlukan('child_process').spawn;
// Hasilkan proses anak dan jalankan arahan "sleep 10"
var child = spawn('tidur', ['10']);
setTimeout(function() {
anak.bunuh();
}, 1000);
child.on('keluar', fungsi(kod, isyarat) {
Jika (kod) {
console.log('proses kanak-kanak ditamatkan dengan kod ');
} lain jika (isyarat) {
console.log('proses kanak-kanak ditamatkan kerana isyarat ');
}
});
Dalam contoh ini, proses kanak-kanak dimulakan untuk melakukan operasi tidur selama 10 saat, tetapi isyarat SIGKILL dihantar kepada proses kanak-kanak sebelum 10 saat, yang akan menghasilkan output berikut:
proses anak ditamatkan kerana isyarat SIGTERM
Hantar isyarat dan proses bunuh
Dalam bahagian ini, anda akan belajar cara menggunakan isyarat untuk mengurus proses kanak-kanak. Isyarat ialah cara mudah untuk proses ibu bapa berkomunikasi dengan, atau bahkan membunuh, proses anak.
Kod isyarat yang berbeza mewakili makna yang berbeza Terdapat banyak isyarat, beberapa yang paling biasa digunakan untuk mematikan proses. Jika proses menerima isyarat bahawa ia tidak tahu bagaimana untuk mengendalikan, program akan terganggu secara tidak normal. Sesetengah isyarat akan dikendalikan oleh proses kanak-kanak, manakala yang lain hanya boleh dikendalikan oleh sistem pengendalian.
Secara amnya, anda boleh menggunakan kaedah child.kill untuk menghantar isyarat kepada proses anak Isyarat SIGTERM dihantar secara lalai:
var spawn = memerlukan('child_process').spawn;
var child = spawn('tidur', ['10']);
setTimeout(function() {
anak.bunuh();
}, 1000);
Anda juga boleh menghantar isyarat tertentu dengan menghantar rentetan yang mengenal pasti isyarat sebagai satu-satunya parameter kaedah bunuh:
anak.bunuh(‘SIGUSR2’);
Perlu diingat bahawa walaupun nama kaedah ini adalah membunuh, isyarat yang dihantar tidak semestinya membunuh proses kanak-kanak. Jika proses kanak-kanak mengendalikan isyarat, tingkah laku isyarat lalai akan ditolak. Subproses yang ditulis dalam Node boleh menulis semula definisi pengendali isyarat seperti berikut:
process.on('SIGUSR2', function() {
console.log('Mendapat isyarat SIGUSR2');
});
Sekarang anda telah menentukan pengendali isyarat SIGUSR2, apabila proses anda menerima isyarat SIGUSR2 sekali lagi, ia tidak akan dimatikan, tetapi akan mengeluarkan ayat "Mendapat isyarat SIGUSR2". Menggunakan mekanisme ini, anda boleh mereka bentuk cara mudah untuk berkomunikasi dengan proses kanak-kanak dan juga mengarahkannya. Walaupun tidak sekaya menggunakan input standard, kaedah ini lebih mudah.
Ringkasan
Dalam bab ini, kami belajar menggunakan kaedah child_process.exec untuk melaksanakan perintah luaran Kaedah ini tidak menggunakan parameter baris arahan, tetapi menghantar parameter kepada proses anak dengan mentakrifkan pembolehubah persekitaran.
Anda juga mempelajari cara memanggil perintah luaran dengan memanggil kaedah child_process.spawn untuk melahirkan proses anak Dengan cara ini, anda boleh menggunakan aliran input dan aliran output untuk berkomunikasi dengan proses anak, atau menggunakan isyarat untuk berkomunikasi dengan dan. membunuh proses kanak-kanak.

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Perkhidmatan Node yang dibina berdasarkan bukan sekatan dan dipacu peristiwa mempunyai kelebihan penggunaan memori yang rendah dan sangat sesuai untuk mengendalikan permintaan rangkaian besar-besaran. Di bawah premis permintaan besar-besaran, isu yang berkaitan dengan "kawalan memori" perlu dipertimbangkan. 1. Mekanisme kutipan sampah V8 dan had ingatan Js dikawal oleh mesin kutipan sampah

Artikel ini akan memberi anda pemahaman yang mendalam tentang memori dan pengumpul sampah (GC) enjin NodeJS V8 saya harap ia akan membantu anda!

Node 19 telah dikeluarkan secara rasmi Artikel ini akan memberi anda penjelasan terperinci tentang 6 ciri utama Node.js 19. Saya harap ia akan membantu anda!

Modul fail ialah enkapsulasi operasi fail asas, seperti membaca/menulis/membuka/menutup/memadam fail, dsb. Ciri terbesar modul fail ialah semua kaedah menyediakan dua versi **segerak** dan ** asynchronous**, dengan Kaedah dengan akhiran penyegerakan adalah semua kaedah penyegerakan, dan kaedah yang tidak semuanya adalah kaedah heterogen.

Memilih imej Docker untuk Node mungkin kelihatan seperti perkara remeh, tetapi saiz dan potensi kelemahan imej itu boleh memberi kesan yang ketara pada proses dan keselamatan CI/CD anda. Jadi bagaimana kita memilih imej Node.js Docker yang terbaik?

Sebab mengapa nod tidak boleh menggunakan arahan npm adalah kerana pembolehubah persekitaran tidak dikonfigurasikan dengan betul Penyelesaiannya ialah: 1. Buka "Sistem Sifat"; 2. Cari "Pembolehubah Persekitaran" -> "Pembolehubah Sistem", dan kemudian edit persekitaran. pembolehubah; 3. Cari lokasi folder nodejs;

Bagaimanakah Node.js melakukan GC (pengumpulan sampah)? Artikel berikut akan membawa anda melaluinya.

Gelung peristiwa ialah bahagian asas Node.js dan mendayakan pengaturcaraan tak segerak dengan memastikan bahawa utas utama tidak disekat Memahami gelung peristiwa adalah penting untuk membina aplikasi yang cekap. Artikel berikut akan memberi anda pemahaman yang mendalam tentang gelung acara dalam Node.
