Rumah  >  Artikel  >  hujung hadapan web  >  Bagaimana untuk meningkatkan kestabilan nodejs

Bagaimana untuk meningkatkan kestabilan nodejs

青灯夜游
青灯夜游asal
2022-01-13 17:03:262309semak imbas

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.

Bagaimana untuk meningkatkan kestabilan nodejs

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);    
});
```
Penjelasan: Mula-mula buat domain (domain.create()), kemudian tambah pengedar yang perlu dipantau ke domain, dan akhirnya mengikat peristiwa ralat pada domain , seperti ini Anda boleh memantaunya.

Lihat contoh lain:

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);
  });
});
Arahan: Mula-mula buat domain, ikat peristiwa ralat pada domain, dan kemudian sediakan fungsi yang boleh dijalankan dalam konteks domain

Bagaimana pula dengan panggilan balik? Anda boleh menggunakannya seperti ini

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.
});
Sudah tentu anda juga boleh menggunakannya seperti ini

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.
});
Fungsi ini hampir sama dengan domain.bind(callback). Walau bagaimanapun, selain menangkap ralat yang dilemparkan, ia juga memintas objek Ralat yang dihantar ke fungsi ini sebagai hujah pertama.

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-node

6) 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/forever

Tetapi selama-lamanya bukan ubat penawar, dan ia juga mengalami perkara berikut masalah:

    Keupayaan pemantauan dan pembalakan terhad
  • Sokongan yang lemah untuk konfigurasi pengurusan proses
  • Tiada sokongan untuk kelompok
  • Penuaan asas kod (bermaksud menaik taraf node.js Kegagalan yang kerap)
Dilampirkan kod ujian artikel ini: https://github.com/yupeng528/node-error

Untuk lebih banyak pengetahuan berkaitan nod, sila lawati:

tutorial nodejs! !

Atas ialah kandungan terperinci Bagaimana untuk meningkatkan kestabilan nodejs. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn