欧美亚洲中文,在线国自产视频,欧洲一区在线观看视频,亚洲综合中文字幕在线观看

      1. <dfn id="rfwes"></dfn>
          <object id="rfwes"></object>
        1. 站長資訊網(wǎng)
          最全最豐富的資訊網(wǎng)站

          如何提升nodejs的穩(wěn)定性

          提升nodejs穩(wěn)定性的方法:1、保持良好的代碼結(jié)構(gòu);2、使用“try~catch”來捕獲異常;3、使用domain模塊來處理程序的異常;4、使用log4js模塊記錄日志;5、使用forever模塊管理nodejs。

          如何提升nodejs的穩(wěn)定性

          本教程操作環(huán)境:windows7系統(tǒng)、nodejs 12.19.0版,DELL G3電腦。

          提高nodejs程序的穩(wěn)定性,健壯性

          在網(wǎng)上看到一些帖子,吐糟,質(zhì)疑nodejs 程序的穩(wěn)定性,為什么呢?其一,可能這個和javascript有關(guān)吧,node是拿javascript去實(shí)現(xiàn)的,而javascript又被稱為是“世界上誤解最深的語言”,我們可以去看看nodejs 創(chuàng)始人的說法,可以去看看知乎的這篇文章,為什么node 用javascript去實(shí)現(xiàn),其二,nodejs 畢竟還年輕,而且官網(wǎng)在部分模塊也標(biāo)注了此模塊的目前的狀態(tài)。

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

          1)保持良好的代碼結(jié)構(gòu):

          我們知道node是單線程,非阻塞io,默認(rèn)就是異步,通過回調(diào)的方式處理后面的流程,如果嵌套的層次太多了,勢必會引起代碼邏輯結(jié)構(gòu)的混亂,也不利于維護(hù)和升級,可以采用async這個異步流程控制模塊,來理清我們的代碼邏輯。

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

          3)使用try~catch 來捕獲異常:

          這個只能解決一部分問題,不是萬能的,在上面說到因?yàn)閚ode是單線程,非阻塞io,默認(rèn)就是異步,通過回調(diào)的方式處理后面的流程,try~catch 是不能捕獲的callback 里面的error的錯誤的,怎么捕獲到callback里面的錯誤呢 ? 可以采用domain模塊

          4)使用domain模塊來處理程序的異常

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

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

          serverDomain.run(function() {   // 服務(wù)器在serverDomain的作用域內(nèi)被創(chuàng)建   http.createServer(function(req, res) {     // req和res同樣在serverDomain的作用域內(nèi)被創(chuàng)建     // 但是,我們想對于每一個請求使用一個不一樣的域。     // 所以我們首先創(chuàng)建一個域,然后將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);     }); ```

          說明:首先創(chuàng)建一個域(domain.create()),然后將需要監(jiān)控的分發(fā)器添加到該域上,最后給域綁定一個錯誤事件,這樣就可以監(jiān)控了。

          再看一個例子:

          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;         // 繼續(xù)。。。       });     }, 100);   }); });

          說明:首先創(chuàng)建一個域,給域綁定一個錯誤事件,然后在域的上下文提供可以運(yùn)行的函數(shù)

          如果對于回調(diào)呢?可以這么使用

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

          當(dāng)然也可以這么使用

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

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

          5)使用log4js 模塊記錄日志

            log4js 是一個非常強(qiáng)大的日志管理工具,在可以看看github這個項(xiàng)目: https://github.com/nomiddlename/log4js-node

          6)使用forever 模塊來管理nodejs

            forever 是服務(wù)端管理nodejs 的一個模塊,一個命令行工具,能夠啟動,停止app 應(yīng)用。forever完全是基于命令行操作,在forever進(jìn)程管理之下,創(chuàng)建node的子進(jìn)程,通過monitor監(jiān)控node子進(jìn)程的運(yùn)行情況,一旦文件更新,或者進(jìn)程掛掉,forever會自動重啟node服務(wù)器,確保應(yīng)用正常運(yùn)行。非常的好用.

          可以關(guān)注下這個項(xiàng)目:https://github.com/nodejitsu/forever

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

          • 有限的監(jiān)控和日志功能
          • 進(jìn)程管理配置的支持差
          • 不支持集群
          • 代碼庫老化(意味著在升級node.js時頻繁的失敗)

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

          贊(0)
          分享到: 更多 (0)
          網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號