搜尋
首頁web前端前端問答如何提升nodejs的穩定性
如何提升nodejs的穩定性Jan 13, 2022 pm 05:03 PM
nodejs穩定性

提升nodejs穩定性的方法:1、保持良好的程式碼結構;2、使用「try~catch」來擷取異常;3、使用domain模組來處理程式的異常;4、使用log4js模組記錄日誌;5、使用forever模組管理nodejs。

如何提升nodejs的穩定性

本教學操作環境:windows7系統、nodejs 12.19.0版,DELL G3電腦。

提高nodejs程式的穩定性,健壯性

#在網路上看到一些帖子,吐糟,質疑nodejs 程式的穩定性,為什麼呢?其一,可能這個和javascript有關吧,node是拿javascript去實現的,而javascript又被稱為是“世界上誤解最深的語言”,我們可以去看看nodejs 創始人的說法,可以去看看知乎的這篇文章,為什麼node 用javascript去實現,其二,nodejs 畢竟還年輕,而且官網在部分模組也標註了此模組的目前的狀態。

這2天我抽了點時間思考了下這個問題,我覺得我們程式首先功能應該是獨立的,就是一個功能出異常了,不應該去影響另外一個正常的功能,不應該將整個程式都崩潰掉,其次,即使是程式崩潰了,我們也應該有一個讓程式自動啟動,另外,應該去記錄日誌,方便我們追蹤問題。我覺得主要可以從以下方面提高nodejs 穩定性:

1)保持良好的程式碼結構:

我們知道node是單線程,非阻塞io,默認就是異步,透過回調的方式處理後面的流程,如果嵌套的層次太多了,勢必會引起程式碼邏輯結構的混亂,也不利於維護和升級,可以採用async這個非同步流程控制模組,來理清我們的程式碼邏輯。

2)使用 process.on('uncaughtException', function(err){...}); 來處理未被捕捉的錯誤。

3)使用try~catch 來捕捉例外:

這個只能解決一部分問題,不是萬能的,在上面說到因為node是單線程,非阻塞io,預設就是異步,透過回呼的方式處理後面的流程,try~catch 是不能捕獲的callback 裡面的error的錯誤的,怎麼捕獲到callback裡面的錯誤呢? 可以採用domain模組

4)使用domain模組來處理程式的異常

先看看domain的解釋:domain是 EventEmitter類別的子類別。監聽它的error事件來處理它捕捉到的錯誤。 它提供了一種方式,即以一個單一的組的形式來處理多個不同的IO操作。如果任何一個註冊到domain的事件觸發器或回調觸發了一個‘error’事件,或者拋出一個錯誤,那麼domain物件將會被通知到。而不是直接讓這個錯誤的上下文從`process.on('uncaughtException')'處理程序中丟失掉,也不會致使程式因為這個錯誤伴隨著錯誤碼立即退出。

如何使用domain 模組呢?看一個例子:

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);    
});
```

說明:先建立一個網域(domain.create()),然後將需要監控的分發器加入到該網域上,最後給網域綁定一個錯誤事件,這樣就可以監控了。

再看一個例子:

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.
});

這個函數與domain.bind(callback)幾乎一模一樣。但是,除了捕捉被拋出的錯誤外,它還會攔截作為第一參數被傳遞到​​這個函數的Error物件。

5)使用log4js 模組記錄日誌

  log4js 是一個非常強大的日誌管理工具,在可以看看github這個專案: https://github.com /nomiddlename/log4js-node

6)使用forever 模組來管理nodejs

  forever 是服務端管理nodejs 的一個模組,一個命令列工具,能夠啟動,停止app 應用。 forever完全是基於命令列操作,在forever進程管理之下,創建node的子進程,透過monitor監控node子進程的運行情況,一旦檔案更新,或者進程掛掉,forever會自動重啟node伺服器,確保應用正常運行。非常的好用.

可以關注下這個項目:https://github.com/nodejitsu/forever

但是forever 也不是萬能的,也由下面這些問題:

  • 有限的監控和日誌功能
  • 進程管理配置的支援差
  • 不支援叢集
  • 程式碼庫老化(意味著在升級node.js時頻繁的失敗)

附上本文測試程式碼:https://github.com/yupeng528/node-error  

更多node相關知識,請造訪: nodejs 教學! !

以上是如何提升nodejs的穩定性的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Vercel是什么?怎么部署Node服务?Vercel是什么?怎么部署Node服务?May 07, 2022 pm 09:34 PM

Vercel是什么?本篇文章带大家了解一下Vercel,并介绍一下在Vercel中部署 Node 服务的方法,希望对大家有所帮助!

node.js gm是什么node.js gm是什么Jul 12, 2022 pm 06:28 PM

gm是基于node.js的图片处理插件,它封装了图片处理工具GraphicsMagick(GM)和ImageMagick(IM),可使用spawn的方式调用。gm插件不是node默认安装的,需执行“npm install gm -S”进行安装才可使用。

火了!新的JavaScript运行时:Bun,性能完爆Node火了!新的JavaScript运行时:Bun,性能完爆NodeJul 15, 2022 pm 02:03 PM

今天跟大家介绍一个最新开源的 javaScript 运行时:Bun.js。比 Node.js 快三倍,新 JavaScript 运行时 Bun 火了!

聊聊Node.js中的多进程和多线程聊聊Node.js中的多进程和多线程Jul 25, 2022 pm 07:45 PM

大家都知道 Node.js 是单线程的,却不知它也提供了多进(线)程模块来加速处理一些特殊任务,本文便带领大家了解下 Node.js 的多进(线)程,希望对大家有所帮助!

nodejs中lts是什么意思nodejs中lts是什么意思Jun 29, 2022 pm 03:30 PM

在nodejs中,lts是长期支持的意思,是“Long Time Support”的缩写;Node有奇数版本和偶数版本两条发布流程线,当一个奇数版本发布后,最近的一个偶数版本会立即进入LTS维护计划,一直持续18个月,在之后会有12个月的延长维护期,lts期间可以支持“bug fix”变更。

node爬取数据实例:聊聊怎么抓取小说章节node爬取数据实例:聊聊怎么抓取小说章节May 02, 2022 am 10:00 AM

node怎么爬取数据?下面本篇文章给大家分享一个node爬虫实例,聊聊利用node抓取小说章节的方法,希望对大家有所帮助!

深入浅析Nodejs中的net模块深入浅析Nodejs中的net模块Apr 11, 2022 pm 08:40 PM

本篇文章带大家带大家了解一下Nodejs中的net模块,希望对大家有所帮助!

怎么获取Node性能监控指标?获取方法分享怎么获取Node性能监控指标?获取方法分享Apr 19, 2022 pm 09:25 PM

怎么获取Node性能监控指标?本篇文章来和大家聊聊Node性能监控指标获取方法,希望对大家有所帮助!

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具