node如何避免崩掉?入门百科_node基础知识教程

当你在node中没有处理reject状态的promise或在一个流中没有处理错误error事件,会引起你的程序崩溃。下面我们来看一下如何避免我们的node程序崩溃。第一个问题 未处理的rejections在最新的node版本(8.X、9.X中),如果你有未处理的reject promise,控制台界面上会出现以下信息(node:48446) Unhandle

node如何避免崩掉?入门百科

当你在node中没有处理reject状态的promise或在一个流中没有处理错误error事件,会引起你的程序崩溃。下面我们来看一下如何避免我们的node程序崩溃。

node如何避免崩掉?入门百科_node基础知识教程

第一个问题 未处理的rejections

在最新的node版本(8.X、9.X中),如果你有未处理的reject promise,控制台界面上会出现以下信息

(node:48446) UnhandledPromiseRejectionWarning: This is fine
(node:48446) UnhandledPromiseRejectionWarning: Unhandled promise rejection. 
This error originated either by throwing inside of an async function without a catch block, 
or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:48446) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. 
In the future, promise rejections that are not handled will terminate the Node.js process 
with a non-zero exit code.

这里有两条比较重要的信息:

进程并没有崩溃。进程会继续工作,但是你已经收到了错误提醒。

然而,在以后可能表现行为会改变。在未来的版本中,process进程会因此崩溃,并以非0的状态码退出。

接下来你可能想知道该如何正确地应对这种情况,你可能会想到把错误和栈跟踪信息发送到一个统计服务器上面,来收集错误信息。不用担心,nodeJs有提供一些办法。你可以监听由process触发的unhandledRejection事件:

process.on('unhandledRejection', (reason, promise) => {
  console.log('Unhandled Rejection:', reason)  
  // 在这里处理}
  )

在浏览器端也可以监听unhandledrejection事件,可以直接在window对象上添加监听器

window.addEventListener('unhandledrejection, '({
    reason
  }) => {   // 在这里处理错误
  });

监听的回调函数里面的reason参数就是reject返回的对象,比如Promise.reject(new Error(‘This is fine’)),在回调函数里的reason就是那个error实例。所以在调用reject时,传递详细明确的错误类型或者信息进去是很重要的。

你也可以监听process触发的warn事件,来获取关于未处理的rejections的信息。

第二个问题 steam中未处理的错误事件

你可以尝试在你的node程序中写下如下代码:

会发生什么?boom 你的程序会以一个非0的状态码崩溃。并且会打印出以下错误信息:

events.js:137
      throw er; // Unhandled 'error' event
      ^Error: ENOENT: no such file or directory, open 'do-not-exists.txt'

想象一下这种情景:有个用户上传一个文件给你的网站,在node服务端会以steam流来处理文件,因为它可能会很大,在传输过程中,用户关掉了程序,中断了过程。

steam流意外的关闭了,如果没有错误处理的话,你的node程序直接崩溃了,所有用户都不能使用了。 所以要在所有处理stream流的地方,进行错误处理,来避免这种情况发生。

额外的炸弹: JSON.parse()

这个看似无害的函数,当你传入一个不合法的JSON字符串时,也会抛出一个错误。使用它时一定要用try/catch包起来或者放入promise,在处理generator函数或者async函数时,也是同样的道理。不然的话,像如下代码就会杀掉你的程序:

app.get('/foo', (req, res, next) => {
  const foo = JSON.parse(req.body.jsonString)  
  // ...
  })

总结:

永远要处理promise的rejection,监听unhandledRejection事件只是做为处理rejection的最后一道防线,并协助debug以及收集错误报告。具体的每个promise都应该自行catch处理rejection。

在处理stream流的时候,一定要处理错误。

在处理*Sync()函数以及JSON.parse()时,一定要用try/catch包起来或者放入promise中。

海计划公众号
(0)
上一篇 2020/03/24 05:43
下一篇 2020/03/24 05:43

您可能感兴趣的内容

  • Chromoscope指南攻略_让你拥有超人般的透视能力,可以自主选择

    Chromoscope指南攻略 官方网址:http://www.chromoscope.net/ 简介描述:让你拥有超人般的透视能力,可以自主选择 让你拥有超人般的透视能力,可以自…

    2020/03/08
  • CORS跨域请求使用说明_跨域使用指南

    造成跨域的两种策略浏览器的同源策略会导致跨域,这里同源策略又分为以下两种DOM同源策略:禁止对不同源页面DOM进行操作。这里主要场景是iframe跨域的情况,不同域名的iframe是限制互相访问的。XmlHttpRequest同源策略:禁止使用XHR对象向不同源的服务器地址发起HTTP请求。只要协议、域名、端口有任何一个不同,都被当作是不同的域,之间的请求就

    2020/04/05
  • turbolinks入门基础_Web 加载优化方案

    turbolinks入门基础 GitHub:https://github.com/turbolinks/turbolinks 简介描述:Web 加载优化方案 Turbolinks …

    2020/03/06
  • GifHome入门百科_一款在线免费GIF编辑器

    GifHome入门百科 官方网址:http://tool.gifhome.com/ 简介描述:一款在线免费GIF编辑器 GifHome工具是一款在线免费GIF编辑器,提供在线GIF…

    2020/03/11
  • CSS层叠样式表攻略教程_样式小白基础

    简介层叠样式表,用来表现HTML或者XML等文件样式的计算机语言。网页表现与内容分离的样式设计语言,能够对网页中对象排版进行像素级精确控制,几乎支持所有字体字号,拥有对网页对象和模型样式编辑能力,并能进行初步交互设计使用方式(就近原则)1 元素内嵌样式表Hello2 文档类型样式表(head里)a

    2020/03/31
  • node代码如何加密?入门指南_加密菜鸟攻略

    要用nodejs开发接口,实现远程调用,如果裸奔太危险了,就在网上找了一下nodejs的加密,感觉node-rsa挺不错的,下面来总结一下简单的rsa加密解密用法。node代码加密方法如下:1、初始化环境新建一个文件夹node-rsa-demo , 终端进入,运行下面命令初始化cd node-rsa-demo
    npm init # 一路回车即可
    npm in

    2020/03/24
  • Primus小白基础_通用包装器实时框架

    Primus小白基础 GitHub:https://github.com/primus/primus 简介描述:通用包装器实时框架 是Transformer的创造者,并且也被称为通…

    2020/03/06
  • 有申根签证菲律宾可以免签停留7天吗?入门基础知识_活动使用帮助

    最近有些朋友去旅游的时候听了一些签证人员的介绍,说只需要一个申根签证就可以到菲律宾自由旅行了。那么什么是申根签证呢?这个申根签证菲律宾可以免签吗?接下来就让华商签证为大家解答一下相关问题。申根签证介绍?  简单来说就是,几个国家在在卢森堡一个小城申根签订了申根公约。它规定了成员国的单一签证政策,实施这项协议的国家便是所谓的“申根国家”。持任何一个申根成员国签

    2020/03/20
  • https的基本原理基础指南_原理入门教程

    HTTPS = HTTP + TLS/SSL,简单理解 HTTPS 其实就是在 HTTP 上面加多了一层安全层。HTTP 可以是 Http2.0 也可以是 Http1.1,不过现在 Http2.0 是强制要求使用 Https 的。HTTPS 基本原理首先需要一个第三方认证机构(CA认证),确保公钥的合法性(即证书,不合法的证书浏览器会警告),然后利用非对称加

    2020/03/26
  • 学习掌握小白攻略proto与prototype_prototype攻略教程

    一,前言对一个知识点是否完全把握,最好的校验方法就是能否用自己的语言将其表述出来。 原型与原型链一直是学习 JS 绕不过的知识点,其中proto 与 prototype 最为让人头疼,这里简单的写下我自己的理解,从原型与原型链中拆解 proto 与 prototype ,希望能对大家有所帮助。一,原型1,定义在javascript中,函数可以有属性。 每个

    2020/03/24
  • 365psd新手入门_免费的 PSD、图形和矢量文件

    365psd新手入门 官方网址:https://365psd.com/ 简介描述:免费的 PSD、图形和矢量文件 下载免费高品质的 PSD 文件、插图和图形。浏览我们的图库,快速找…

    2020/03/06
  • ZUI使用指南一个基于 Bootstrap 深度定制开源前端实践方案,帮助你快速构建现代跨屏应用。

    ZUI基础入门 官方网址:http://www.zui.sexy/ GitHub:https://github.com/easysoft/zui 简介描述:一个基于 Bootstr…

    2020/03/05
  • CSS定位小白攻略_定位菜鸟指南

    一、什么是定位改变元素在页面中的位置二、定位的分类 1、普通流定位 2、浮动定位 3、相对定位 4、绝对定位 5、固定定位三、普通流定位页面中元素的默认定位方式,默认文档流,从上往下,从左往右1、每个元素都在页面有自己的空间2、每个元素都是从父元素的左上角开始显示3、块级元素都是按照从上到下的方式逐行排列,每个元素独占一行4、行

    2020/03/24
  • 前端开发博客使用帮助_前端开发,前端博客

    前端开发博客使用帮助 官方网址:http://caibaojian.com/ 简介描述:前端开发,前端博客 专注于前端开发,分关注Web前端开发技术,移动前端开发,前端资讯,同时分…

    2020/03/06
  • JDC使用教程_注于电子商务视觉设计、交互设计、用户研究、前端开发

    JDC入门百科 官方网址:http://jdc.jd.com/ 简介描述:注于电子商务视觉设计、交互设计、用户研究、前端开发 京东用户体验设计部门,致力于创造更美好的电子商务购物体…

    2020/03/06
  • 酷壳入门百科_享受编程和技术所带来的快乐

    酷壳入门百科 官方网址:https://coolshell.cn/ 简介描述:享受编程和技术所带来的快乐 是一个完全依靠个人建立的技术性BLOG。是一个分享技术见闻,知识,趋势的网…

    2020/03/06