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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

node 进阶 | 通过node中如何捕获异常阐述express的特点

發布時間:2025/7/25 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 node 进阶 | 通过node中如何捕获异常阐述express的特点 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

node如何捕獲異常

    node基于js的單線程,有了非阻塞異步回調的概念,但是在處理多個并發連接時,并發環境要求高,最重要的是單線程,單核CPU,一個進程crash則web服務都crash,但是為什么node還這么火?甚至有了Node工程師這個崗,肯定就是node有自己crash之前與之后的解決方法,比如捕獲異常

   問:nodejs如何捕獲異常?答:回調函數中有err形參,console.log出來,這是我之前回答別人問題的答案,但是自從我這幾天看了如何捕獲異常,才知道捕獲異常的精髓就是不要讓服務crash掉,拋出500狀態碼。而我回答的是風馬牛不相及。

    一般如何捕獲異常

   1、使用uncaughtExprection去捕獲異常

process.on("uncaughtExpection",function(err){console.log(err) })

   2、用try-catch在回調函數前捕獲異常    

var http = require('http');http.createServer(function(req, res) {try {fn(req, res);} catch(e) {console.log(e.stack);res.end("Error")} }).listen(3000);function fn (req, res) {var name = req.body.name;res.end("回調函數"); };

   3、用框架去包住,捕獲異常,express做的好

app.use(function(req, res, next) {var err = new Error('Not Found');err.status = 404;next(err); });// error handler app.use(function(err, req, res, next) {// set locals, only providing error in developmentres.locals.message = err.message;res.locals.error = req.app.get('env') === 'development' ? err : {};// render the error pageres.status(err.status || 500);res.render('error'); });
  特殊情況如何捕獲異常

  如果在回調函數中如何捕獲異常呢?

  如果是回調函數中捕獲異常怎么做?用domain去捕獲,domian捕獲會拋出500錯誤,但是domain捕獲有一個問題,會丟失棧信息,無法保證程序健康進行,所以要結束進程,在回調函數中process.exit(1),然后用node的server.close方法再去釋放,server.close連接釋放后自動結束進程,所以不用在server.close中去結束進程process.exit(1)
  uncaughtExpection捕獲異常的的原理就是:uncaughtExpection事件存在回調函數process.on("uncaughtExpection",callback)時node不會強制結束進程,這樣可彌補domain丟失stack的問題
  所以domian去捕獲絕大部分回調函數中的異常,uncaughtExpection去捕獲丟失stack異常,這樣就完整了

  uncaughtExprection+domain去捕獲回調函數中的異常就ok

app.use(function(req,res,next){var reqDomain = domain.create();reqDomain.on("err",function(){try {var killTimer = setTimeout(function(){process.exit(1);},1000)killTimer.unref();server.close();res.send(500);} catch(e) {// statements console.log(e.stack);}})reqDomain.run(next);}); process.on("uncaughtException",function(err){console.log(err);try{var killTimer = setTimeout(function(){process.exit(1)},1000)killTimer.unref();server.close();}catch(e){console.log(e.stack);} });

express特點

  express的優點

  1、對node的HTTP封裝好了,直接去app.listen

  2、中間件完成了post/get請求,回調函數中有req,res,next,其中next的作用就是把請求傳遞給下一個中間件,比如兩次使用use中間件去處理同一請求,用next傳遞可以同時處理

  3、對post封裝的很好,post中node中是這樣寫的

function onRequest(req,res){req.addListener("data",function(postdata){//data })req.addListener("end",function(){//router })}

?實現post請求需要監聽兩次事件:"data"、"end"。先執行data事件,data事件接收數據塊,接收完畢且成功,再觸發一次end事件,將post的數據返還給路由

  而app.post就完成了,最多需要設定

app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false }));

  用于接收post請求的參數

  4、內置路由,提高了代碼復用率

    

app.use('/', index);

  5、node沒有web容器的概念,express有設置了靜態文件夾

app.use(express.static(path.join(__dirname, 'public')));

  6、設置了ejs/jade模版引擎

app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'ejs');

  7、對cookie、mongoDB等操作良好

  8、npm、require包或文件非常方便

  etc...

  express缺點

  與express框架同一個類型的有koa hapi 等,沒用過后兩個,不好評價

  據說一個尷尬的缺點,一個問題express有多個操縱方法

  還有一個,回調函數中嵌套回調函數,容易引用錯誤的變量,或者無意中改了外部變量

  了解更多點這里

  其實node如何捕獲異常和express的特點,這兩個問題是電面螞蟻金服問的問題,我回答的不好,所以連夜回顧,整體,分析,總結

  好了,今天的進階完畢,下次更新就是分析js所有的異步操作,包括ES6的Promise和ES7的async/await,晚安

  

轉載于:https://www.cnblogs.com/dirkhe/p/7368357.html

總結

以上是生活随笔為你收集整理的node 进阶 | 通过node中如何捕获异常阐述express的特点的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。