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的特点相关推荐

  1. 前端进阶必备Node.js,你得了解一下

    作为前端开发,工作中肯定离不开 JavaScript ,而 Node.js 是基于 JavaScript 语言和 V8 引擎的 Web 服务器项目,让你可以直接使用 JavaScript 来搭架服务器 ...

  2. node.js api接口_如何在Node.js API客户端中正常处理故障

    node.js api接口 by Roger Jin 罗杰·金(Roger Jin) 如何在Node.js API客户端中正常处理故障 (How to gracefully handle failur ...

  3. node进阶学习(express)

    node进阶学习(框架) express ​ 是node.js的一个应用框架,给我们提供了强大的特性和丰富的http工具.(koa同一个作者的框架) 功能: 扩展了web所需要的基本功能 丰富的htt ...

  4. css中的node.js_在Node App中使用基本HTML,CSS和JavaScript

    css中的node.js You may think this is not important, but it is!. As a beginner in node.js, most coding ...

  5. Node.js:项目中的 package.json 格式

    1. node.js 项目包下的 package.json : 实例: {"name" : "chatroooms","version" : ...

  6. node.js ejs_如何在Node.js应用程序中使用EJS模板

    node.js ejs by Jennifer Bland 詹妮弗·布兰德(Jennifer Bland) 如何在Node.js应用程序中使用EJS模板 (How to use EJS Templat ...

  7. 【Node学习】—Node.js中模块化开发的规范

    [Node学习]-Node.js中模块化开发的规范 Node.js 规定一个JavaScript就是一个模块,模块内部定义的变量和函数默认情况下在外部无法得到 模块化内部可以使用exports对象进行 ...

  8. Node.js TLSWrap 实现中的释放后使用漏洞分析

     聚焦源代码安全,网罗国内外最新资讯! Node v14.11.0 版本的 TLS 实现中存在一个释放后使用漏洞. 当写入启用 TLS 的套接字时,node::StreamBase::Write 调用 ...

  9. package.json在Node JS应用程序中的重要性

    Before starting Node JS applications development, we should learn some basics and importance of pack ...

最新文章

  1. iOS-禁止scrollview垂直方向滚动,只允许水平方向滚动;或只允许垂直方向滚动...
  2. 2021年中国工业互联网安全大赛核能行业赛道writeup之隐写
  3. (亲测可行)基于面绘制的MC算法以及基于体绘制的 Ray-casting 实现Dicom图像的三维重建(python实现)
  4. java程序设计B_Java程序设计11——GUI设计与事件处理B
  5. Deep Learning(深度学习)学习笔记整理系列之(二)
  6. mysql注入反弹_Discuz!x xss反弹后台无防御sql注入getshell(附带exploit)
  7. 关于Maven中pom自动补全
  8. LCAOSCF自洽场氟化氢HF斯莱特函数
  9. 《剑指offer》跳台阶
  10. PyOpenCL图像处理:Box模糊
  11. 《深入理解 Spring Cloud 与微服务构建》第六章 服务注册和发现 Eureka
  12. js键盘相关知识总结
  13. Oracle、SQL Server、MySQL数据类型对比
  14. Linux数据报文的来龙去脉
  15. 编程语言新宠儿——Julia诞生记(转)
  16. android http上传,Android HttpClient上传文件(亲测,成功)
  17. Ubuntu 软件包管理 常用 apt 命令
  18. 直播类 APP 项目开发实战(原理篇)
  19. html透明背景字体不透明,css3背景透明,文字不透明
  20. HTML基础(新手入门教程)

热门文章

  1. Python之黏包的解决
  2. 《Linux命令行与shell脚本编程大全 第3版》Shell脚本编程基础---20
  3. 关于jQuery中的offset()和position()
  4. 微软面试题 单向链表找环
  5. cv::Mat dst 这句话从语法是怎么理解?
  6. c/c++中typedef详解(此文对typedef用于结构体的定义说明得很清楚到位)
  7. 使用links方式安装eclipse插件
  8. C++ memcpy和memmove实现
  9. jmeter怎么在服务器上运行,如何通过jenkins在远程服务器上运行jmeter测试
  10. 【连载】物联网全栈教程-从云端到设备(十三)---安装单片机编译环境