Kaedah untuk meningkatkan kestabilan nodej: 1. Kekalkan struktur kod yang baik 2. Gunakan "try~catch" untuk menangkap pengecualian 3. Gunakan modul domain untuk mengendalikan pengecualian program; modul untuk merekod Log; 5. Gunakan modul forever untuk menguruskan nodej.
Persekitaran pengendalian tutorial ini: sistem Windows 7, nodejs versi 12.19.0, komputer DELL G3.
Tingkatkan kestabilan dan keteguhan program nodejs
Saya melihat beberapa siaran di Internet, mengadu dan mempersoalkan kestabilan program nodejs Kenapa? Pertama, mungkin ini ada kaitan dengan JavaScript Node dilaksanakan dengan JavaScript, dan JavaScript juga dikenali sebagai "bahasa yang paling tidak difahami di dunia." Lihat. Dalam artikel ini, mengapa node menggunakan javascript untuk melaksanakannya. Kedua, nodejs masih muda, dan laman web rasmi juga menandakan status semasa modul ini dalam beberapa modul.
Saya telah mengambil sedikit masa untuk memikirkan tentang isu ini dalam dua hari yang lalu, saya fikir fungsi pertama program kami sepatutnya bebas tidak Ranap keseluruhan program Kedua, walaupun program ranap, kita harus mempunyai program untuk bermula secara automatik Selain itu, kita harus merekodkan log untuk memudahkan kita menjejaki masalah. Saya rasa kestabilan nodej boleh dipertingkatkan terutamanya daripada aspek berikut:
1) Mengekalkan struktur kod yang baik:
Kami tahu bahawa nod adalah satu-benang, io tidak menyekat, secara lalai Ia tidak segerak, dan proses seterusnya diproses melalui panggilan balik Jika terdapat terlalu banyak tahap bersarang, ia pasti akan menyebabkan kekeliruan dalam struktur logik kod, dan tidak kondusif untuk penyelenggaraan dan peningkatan. Anda boleh menggunakan async, modul kawalan proses tak segerak, untuk menjelaskan logik kod kami.
2) Gunakan process.on('uncaughtException', function(err){...});
3) Gunakan try~catch untuk menangkap pengecualian:
Ini hanya boleh menyelesaikan sebahagian daripada masalah, bukan semuanya Seperti yang dinyatakan di atas, nod ialah a Thread tunggal, io tidak menyekat, adalah tidak segerak secara lalai Proses berikutnya diproses melalui panggilan balik cuba~tangkap tidak boleh menangkap ralat dalam panggilan balik
4) Gunakan modul domain untuk mengendalikan pengecualian program
Mari kita lihat dahulu penjelasan domain: domain ialah subkelas bagi kelas EventEmitter. Dengar peristiwa ralatnya untuk mengendalikan ralat yang ditangkapnya. Ia menyediakan cara untuk mengendalikan berbilang operasi IO yang berbeza sebagai satu kumpulan. Jika sebarang pencetus peristiwa atau panggil balik yang didaftarkan pada domain mencetuskan peristiwa 'ralat' atau menimbulkan ralat, objek domain akan dimaklumkan. Daripada terus kehilangan konteks ralat ini daripada pengendali `process.on('uncaughtException')', ia tidak akan menyebabkan atur cara keluar serta-merta kerana ralat ini disertai dengan kod ralat. Bagaimana untuk menggunakan modul domain? Lihat contoh:serverDomain.run(function() { // 服务器在serverDomain的作用域内被创建 http.createServer(function(req, res) { // req和res同样在serverDomain的作用域内被创建 // 但是,我们想对于每一个请求使用一个不一样的域。 // 所以我们首先创建一个域,然后将req和res添加到这个域上。 var reqd = domain.create(); reqd.add(req); reqd.add(res); reqd.on('error', function(er) { console.error('Error', er, req.url); try { res.writeHead(500); res.end('Error occurred, sorry.'); } catch (er) { console.error('Error sending 500', er, req.url); } }); }).listen(1337); }); ```
var d = domain.create(); d.on('error', function(er) { console.error('Caught error!', er); }); d.run(function() { process.nextTick(function() { setTimeout(function() { // 模拟几个不同的异步的东西 fs.open('non-existent file', 'r', function(er, fd) { if (er) throw er; // 继续。。。 }); }, 100); }); });
var d = domain.create(); function readSomeFile(filename, cb) { fs.readFile(filename, 'utf8', d.bind(function(er, data) { // if this throws, it will also be passed to the domain return cb(er, data ? JSON.parse(data) : null); })); } d.on('error', function(er) { // an error occurred somewhere. // if we throw it now, it will crash the program // with the normal line number and stack message. });
var d = domain.create(); function readSomeFile(filename, cb) { fs.readFile(filename, 'utf8', d.bind(function(er, data) { // if this throws, it will also be passed to the domain return cb(er, data ? JSON.parse(data) : null); })); } d.on('error', function(er) { // an error occurred somewhere. // if we throw it now, it will crash the program // with the normal line number and stack message. });
5) Gunakan modul log4js untuk merekod log
Log4js ialah alat pengurusan log yang sangat berkuasa Anda boleh menyemak projek github ini: https://github. com /nomiddlename/log4js-node6) Gunakan modul forever untuk mengurus nodej
Forever ialah modul untuk pengurusan bahagian pelayan nodejs, alat baris arahan yang boleh dimulakan. Forever sepenuhnya berdasarkan operasi baris arahan Di bawah pengurusan proses selama-lamanya, sub-proses nod dibuat dan status berjalan sub-proses nod dipantau melalui monitor proses hang, selama-lamanya akan memulakan semula pelayan nod secara automatik untuk memastikan bahawa aplikasi dijalankan secara normal. Sangat mudah digunakan. Anda boleh memberi perhatian kepada projek ini: https://github.com/nodejitsu/foreverTetapi selama-lamanya bukan ubat penawar, dan ia juga mengalami perkara berikut masalah:
tutorial nodejs! !
Atas ialah kandungan terperinci Bagaimana untuk meningkatkan kestabilan nodejs. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!