日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Node出错导致运行崩溃的解决方案

發(fā)布時間:2025/3/11 编程问答 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Node出错导致运行崩溃的解决方案 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

許多人都有這樣一種映像,NodeJS比較快; 但是因為其是單線程,所以它不穩(wěn)定,有點不安全,不適合處理復雜業(yè)務(wù); 它比較適合對并發(fā)要求比較高,而且簡單的業(yè)務(wù)場景。?

在Express的作者的TJ Holowaychuk的?告別Node.js一文中列舉了以下罪狀:?

Farewell NodeJS (TJ Holowaychuk)?

??? you may get duplicate callbacks?
??? you may not get a callback at all (lost in limbo)?
??? you may get out-of-band errors?
??? emitters may get multiple “error” events?
??? missing “error” events sends everything to hell?
??? often unsure what requires “error” handlers?
??? “error” handlers are very verbose?
??? callbacks suck?

其實這幾條主要吐嘈了兩點: node.js錯誤處理很扯蛋,node.js的回調(diào)也很扯蛋。?

事實上呢?


事實上NodeJS里程確實有“脆弱”的一面,單線程的某處產(chǎn)生了“未處理的”異常確實會導致整個Node.JS的崩潰退出,來看個例子, 這里有一個node-error.js的文件:?

var http = require('http');var server = http.createServer(function (req, res) {//這里有個錯誤,params 是 undefinedvar ok = req.params.ok;res.writeHead(200, {'Content-Type': 'text/plain'});res.end('Hello World\n'); });server.listen(8080, '127.0.0.1');console.log('Server running at http://127.0.0.1:8080/');

?


啟動服務(wù),并在地址欄測試一下發(fā)現(xiàn)?http://127.0.0.1:8080/? 不出所料,node崩潰了?


$ node node-error Server running at http://127.0.0.1:8080/c:\github\script\node-error.js:5var ok = req.params.ok;^ TypeError: Cannot read property 'ok' of undefinedat Server.<anonymous> (c:\github\script\node-error.js:5:22)at Server.EventEmitter.emit (events.js:98:17)at HTTPParser.parser.onIncoming (http.js:2108:12)at HTTPParser.parserOnHeadersComplete [as onHeadersComplete] (http.js:121:23)at Socket.socket.ondata (http.js:1966:22)at TCP.onread (net.js:525:27)



怎么解決呢?


其實Node.JS發(fā)展到今天,如果連這個問題都解決不了,那估計早就沒人用了。?

使用uncaughtException


我們可以uncaughtException來全局捕獲未捕獲的Error,同時你還可以將此函數(shù)的調(diào)用棧打印出來,捕獲之后可以有效防止node進程退出,如:?

process.on('uncaughtException', function (err) {//打印出錯誤console.log(err);//打印出錯誤的調(diào)用棧方便調(diào)試console.log(err.stack); });

  


這相當于在node進程內(nèi)部進行守護, 但這種方法很多人都是不提倡的,說明你還不能完全掌控Node.JS的異常。?

使用 try/catch


我們還可以在回調(diào)前加try/catch,同樣確保線程的安全。?

var http = require('http');http.createServer(function(req, res) {try {handler(req, res);} catch(e) {console.log('\r\n', e, '\r\n', e.stack);try {res.end(e.stack);} catch(e) { }} }).listen(8080, '127.0.0.1');console.log('Server running at http://127.0.0.1:8080/');var handler = function (req, res) {//Error Popupedvar name = req.params.name;res.writeHead(200, {'Content-Type': 'text/plain'});res.end('Hello ' + name); };

  


這種方案的好處是,可以將錯誤和調(diào)用棧直接輸出到當前發(fā)生的網(wǎng)頁上。?

集成到框架中


標準的HTTP響應(yīng)處理會經(jīng)歷一系列的Middleware(HttpModule),最終到達Handler,如下圖所示:?

?


這 些Middleware和Handler在NodeJS中都有一個特點,他們都是回調(diào)函數(shù),而回調(diào)函數(shù)中是唯一會讓Node在運行時崩潰的地方。根據(jù)這個 特點,我們只需要在框架中集成一處try/catch就可以相對完美地解決異常問題,而且不會影響其它用戶的請求request。?

事實上現(xiàn)在的NodeJS WEB框架幾乎都是這么做的,如?OurJS開源博客所基于的?WebSvr?

就有這么一處異常處理代碼:?

try {handler(req, res);} catch(err) {var errorMsg= '\n'+ 'Error ' + new Date().toISOString() + ' ' + req.url+ '\n'+ err.stack || err.message || 'unknow error'+ '\n';console.error(errorMsg);Settings.showError? res.end('<pre>' + errorMsg + '</pre>'): res.end();}

?


那么不在回調(diào)中產(chǎn)生的錯誤怎么辦?不必擔心,其實這樣的node程序根本就起不起來。?

此外node自帶的?cluster?也有一定的容錯能力,它跟nginx的worker很類似,但消耗資源(內(nèi)存)略大,編程也不是很方便,OurJS并沒有采用此種設(shè)計。?

守護NodeJS進程和記錄錯誤日志


現(xiàn) 在已經(jīng)基本上解決了Node.JS因異常而崩潰的問題,不過任何平臺都不是100%可靠的,還有一些錯誤是從Node底層拋出的,有些異常 try/catch和uncaughtException都無法捕獲。之前在運行ourjs的時侯,會偶爾碰到底層拋出的文件流讀取異常,這就是一個底層 libuv的BUG,node.js在0.10.21中進行了修復。?

面對這種情況,我們就應(yīng)該為nodejs應(yīng)用添加守護進程,讓NodeJS遭遇異常崩潰以后能馬上復活。?

另外,還應(yīng)該把這些產(chǎn)生的異常記錄到日志中,并讓異常永遠不再發(fā)生。?

使用node來守護node


node-forever?提供了守護的功能和LOG日志記錄功能。?

安裝非常容易?

[sudo] npm install forever


使用也很簡單?

$ forever start simple-server.js $ forever list[0] simple-server.js [ 24597, 24596 ]


還可以看日志?

forever -o out.log -e err.log my-script.js

?

使用shell啟動腳本守護node


使用node來守護的話資源開銷可能會有點大,而且也會略顯復雜,OurJS直接在開機啟動腳本來進程線程守護。?

如在debian中放置的 ourjs 開機啟動文件:?/etc/init.d/ourjs?

這個文件非常簡單,只有啟動的選項,守護的核心功能是由一個無限循環(huán) while true; 來實現(xiàn)的,為了防止過于密集的錯誤阻塞進程,每次錯誤后間隔1秒重啟服務(wù)?

WEB_DIR='/var/www/ourjs' WEB_APP='svr/ourjs.js'#location of node you want to use NODE_EXE=/root/local/bin/nodewhile true; do{$NODE_EXE $WEB_DIR/$WEB_APP config.magazine.jsecho "Stopped unexpected, restarting \r\n\r\n"} 2>> $WEB_DIR/error.logsleep 1 done

?

錯誤日志記錄也非常簡單,直接將此進程控制臺當中的錯誤輸出到error.log文件即可: 2>> $WEB_DIR/error.log? 這一行, 2 代表 Error。

?

總結(jié)

以上是生活随笔為你收集整理的Node出错导致运行崩溃的解决方案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日本高清视频www夜色资源 | 久久综合亚洲色hezyo国产 | 性视频网 | 亚洲色图激情小说 | 乱子伦一区二区 | 中文字幕 亚洲一区 | 国产精品成人av久久 | 精品动漫一区二区三区 | 欧美成人午夜精品免费 | 中国黄色录像一级片 | 日韩区欧美区 | 欧美黄色网| 欧美一性一乱一交一视频 | 德国经典free性复古xxxx | 精品人妻无码一区二区三区 | 性感av在线 | 欧美性天天 | 久热免费在线视频 | 日本性猛交 | 久久久久久国产视频 | 日韩视频一区二区三区 | 伊人爱爱网| 天天视频亚洲 | 久操社区 | av无码av天天av天天爽 | 亚洲精品免费av | 亚洲性图一区二区 | 亚洲第9页 | 午夜精品久久久久久久99热黄桃 | 国产高清精品一区二区三区 | 欧美做受视频 | 成人区人妻精品一区二区不卡视频 | 激情五月婷婷综合网 | 成人午夜福利视频 | 日韩久久一级片 | 国产激情啪啪 | 激情五月俺也去 | 一区二区三区在线视频观看 | 欧美精品一区二区不卡 | 伊人在线视频 | 五月婷婷丁香六月 | 久久成人a| 国产午夜精品无码一区二区 | 婷婷综合激情网 | 国产精选毛片 | 亚洲va韩国va欧美va | 日本大尺度电影免费观看全集中文版 | 中文字幕在线高清 | 国产综合在线观看视频 | 亚洲av无码国产精品久久不卡 | 91字幕网| 欧美激情视频网址 | 日本福利在线 | 国产黄色片免费看 | 日韩欧美在线精品 | 国产91黄色 | 青青导航 | 偷拍xxxx| 日本免费小视频 | 97在线免费观看视频 | 亚洲乱熟女一区二区三区小说 | 黄色一级片在线播放 | 一起操在线观看 | 性一交一乱一色一视频麻豆 | 可以免费观看的毛片 | 精品欧美激情精品一区 | 欧美成人三级在线播放 | 久久婷婷五月综合色吧 | 亚洲色成人网站www永久四虎 | 亚洲系列 | 一级黄色片看看 | 亚洲一区二区伦理 | 久久99久久99精品免观看粉嫩 | 国产亚洲av在线 | 精品国产区 | 日本美女一区二区三区 | 国产高清第一页 | 日本一级黄| 在线观看欧美一区二区三区 | japan粗暴video蹂躏 | 91高清视频免费观看 | 狠狠夜 | 成年免费在线观看 | 天天艹天天| 欧美亚洲成人网 | 香蕉视频免费网站 | 精品人妻一区二区三区久久嗨 | 91精品啪在线观看国产 | 91文字幕巨乱亚洲香蕉 | 日韩不卡一区 | 一区二区三区视频在线 | sesese99 | 一级黄色大全 | 成人欧美一区二区三区黑人一 | 日本在线小视频 | 人人爽人人爽人人 | 老牛影视一区二区三区 | 国产成人黄色 | 深爱五月激情网 |