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的特点相关推荐
- 前端进阶必备Node.js,你得了解一下
作为前端开发,工作中肯定离不开 JavaScript ,而 Node.js 是基于 JavaScript 语言和 V8 引擎的 Web 服务器项目,让你可以直接使用 JavaScript 来搭架服务器 ...
- node.js api接口_如何在Node.js API客户端中正常处理故障
node.js api接口 by Roger Jin 罗杰·金(Roger Jin) 如何在Node.js API客户端中正常处理故障 (How to gracefully handle failur ...
- node进阶学习(express)
node进阶学习(框架) express 是node.js的一个应用框架,给我们提供了强大的特性和丰富的http工具.(koa同一个作者的框架) 功能: 扩展了web所需要的基本功能 丰富的htt ...
- 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 ...
- Node.js:项目中的 package.json 格式
1. node.js 项目包下的 package.json : 实例: {"name" : "chatroooms","version" : ...
- node.js ejs_如何在Node.js应用程序中使用EJS模板
node.js ejs by Jennifer Bland 詹妮弗·布兰德(Jennifer Bland) 如何在Node.js应用程序中使用EJS模板 (How to use EJS Templat ...
- 【Node学习】—Node.js中模块化开发的规范
[Node学习]-Node.js中模块化开发的规范 Node.js 规定一个JavaScript就是一个模块,模块内部定义的变量和函数默认情况下在外部无法得到 模块化内部可以使用exports对象进行 ...
- Node.js TLSWrap 实现中的释放后使用漏洞分析
聚焦源代码安全,网罗国内外最新资讯! Node v14.11.0 版本的 TLS 实现中存在一个释放后使用漏洞. 当写入启用 TLS 的套接字时,node::StreamBase::Write 调用 ...
- package.json在Node JS应用程序中的重要性
Before starting Node JS applications development, we should learn some basics and importance of pack ...
最新文章
- iOS-禁止scrollview垂直方向滚动,只允许水平方向滚动;或只允许垂直方向滚动...
- 2021年中国工业互联网安全大赛核能行业赛道writeup之隐写
- (亲测可行)基于面绘制的MC算法以及基于体绘制的 Ray-casting 实现Dicom图像的三维重建(python实现)
- java程序设计B_Java程序设计11——GUI设计与事件处理B
- Deep Learning(深度学习)学习笔记整理系列之(二)
- mysql注入反弹_Discuz!x xss反弹后台无防御sql注入getshell(附带exploit)
- 关于Maven中pom自动补全
- LCAOSCF自洽场氟化氢HF斯莱特函数
- 《剑指offer》跳台阶
- PyOpenCL图像处理:Box模糊
- 《深入理解 Spring Cloud 与微服务构建》第六章 服务注册和发现 Eureka
- js键盘相关知识总结
- Oracle、SQL Server、MySQL数据类型对比
- Linux数据报文的来龙去脉
- 编程语言新宠儿——Julia诞生记(转)
- android http上传,Android HttpClient上传文件(亲测,成功)
- Ubuntu 软件包管理 常用 apt 命令
- 直播类 APP 项目开发实战(原理篇)
- html透明背景字体不透明,css3背景透明,文字不透明
- HTML基础(新手入门教程)
热门文章
- Python之黏包的解决
- 《Linux命令行与shell脚本编程大全 第3版》Shell脚本编程基础---20
- 关于jQuery中的offset()和position()
- 微软面试题 单向链表找环
- cv::Mat dst 这句话从语法是怎么理解?
- c/c++中typedef详解(此文对typedef用于结构体的定义说明得很清楚到位)
- 使用links方式安装eclipse插件
- C++ memcpy和memmove实现
- jmeter怎么在服务器上运行,如何通过jenkins在远程服务器上运行jmeter测试
- 【连载】物联网全栈教程-从云端到设备(十三)---安装单片机编译环境