错误处理

定义错误处理中间件和定义其他中间件一样,除了需要 4 个参数,而不是 3 个,其格式如下 (err, req, res, next)。例如:

app.use(function(err, req, res, next) { console.error(err.stack); res.status(500).send('Something broke!'); }); 

在其他 app.use() 和路由调用后,最后定义错误处理中间件,比如:

var bodyParser = require('body-parser'); var methodOverride = require('method-override'); app.use(bodyParser()); app.use(methodOverride()); app.use(function(err, req, res, next) { // 业务逻辑 }); 

中间件返回的响应是随意的,可以响应一个 HTML 错误页面、一句简单的话、一个 JSON 字符串,或者其他任何您想要的东西。

为了便于组织(更高级的框架),您可能会像定义常规中间件一样,定义多个错误处理中间件。比如您想为使用 XHR 的请求定义一个,还想为没有使用的定义一个,那么:

var bodyParser = require('body-parser'); var methodOverride = require('method-override'); app.use(bodyParser()); app.use(methodOverride()); app.use(logErrors); app.use(clientErrorHandler); app.use(errorHandler); 

logErrors 将请求和错误信息写入标准错误输出、日志或类似服务:

function logErrors(err, req, res, next) { console.error(err.stack); next(err); } 

clientErrorHandler 的定义如下(注意这里将错误直接传给了 next):

function clientErrorHandler(err, req, res, next) { if (req.xhr) { res.status(500).send({ error: 'Something blew up!' }); } else { next(err); } } 

errorHandler 能捕获所有错误,其定义如下:

function errorHandler(err, req, res, next) { res.status(500); res.render('error', { error: err }); } 

如果向 next() 传入参数(除了 ‘route’ 字符串),Express 会认为当前请求有错误的输出,因此跳过后续其他非错误处理和路由/中间件函数。如果需做特殊处理,需要创建新的错误处理路由,如下节所示。

如果路由句柄有多个回调函数,可使用 ‘route’ 参数跳到下一个路由句柄。比如:

app.get('/a_route_behind_paywall', function checkIfPaidSubscriber(req, res, next) { if(!req.user.hasPaid) { // 继续处理该请求 next('route'); } }, function getPaidContent(req, res, next) { PaidContent.find(function(err, doc) { if(err) return next(err); res.json(doc); }); }); 

在这个例子中,句柄 getPaidContent 会被跳过,但 app 中为 /a_route_behind_paywall 定义的其他句柄则会继续执行。

next()next(err) 类似于 Promise.resolve()Promise.reject()。它们让您可以向 Express 发信号,告诉它当前句柄执行结束并且处于什么状态。next(err) 会跳过后续句柄,除了那些用来处理错误的句柄。

缺省错误处理句柄

Express 内置了一个错误处理句柄,它可以捕获应用中可能出现的任意错误。这个缺省的错误处理中间件将被添加到中间件堆栈的底部。

如果你向 next() 传递了一个 error ,而你并没有在错误处理句柄中处理这个 error,Express 内置的缺省错误处理句柄就是最后兜底的。最后错误将被连同堆栈追踪信息一同反馈到客户端。堆栈追踪信息并不会在生产环境中反馈到客户端。

设置环境变量 NODE_ENV 为 “production” 就可以让应用运行在生产环境模式下。

如果你已经开始向 response 输出数据了,这时才调用 next() 并传递了一个 error,比如你在将向客户端输出数据流时遇到一个错误,Express 内置的缺省错误处理句柄将帮你关闭连接并告知 request 请求失败。

因此,当你添加了一个自定义的错误处理句柄后,如果已经向客户端发送包头信息了,你还可以将错误处理交给 Express 内置的错误处理机制。

function errorHandler(err, req, res, next) { if (res.headersSent) { return next(err); } res.status(500); res.render('error', { error: err });

转载于:https://www.cnblogs.com/liusixin/p/6547090.html

express中的错误处理相关推荐

  1. 快递拒收后怎么处理_如何处理快递中的错误

    快递拒收后怎么处理 If you use Express to develop your application, you probably thinking about Errors handlin ...

  2. 【node】express中mysql的基本用法、连接池的使用、事务的回滚

    [node]express中mysql的基本用法.连接池的使用 安装mysql包 mysql的配置信息 mysql基本操作 查询mysql并渲染数据 mysql插入操作 首先在html页面写上< ...

  3. 解决SQL Server 2005 Express中无法连接到服务器问题

    问题描述: 操作系统Windows XP SP2,在SQL Server Management Studio Express 中,以SQL Server验证模式用sa登录,出现无法连接到服务器问题. ...

  4. GraphQL学习第三篇 -在Express中使用GraphQL

    在Express中使用GraphQL主要有以下几步: 1. 安装 graphql 和 express-graphql: 2. 引入express-graphql: 3. 引入自定义的schema,其中 ...

  5. Outlook Express出0x800C0133错误的解决

    一电脑Outlook Express收公司邮箱一直出下面的错误: 出现未知错误. 帐户: 'mail.xxxxxxx.com', 服务器: 'mail.xxxxxxx.com', 协议: POP3, ...

  6. multer 文件上传系统在express中的使用

    multer 文件上传系统在express中的使用 参考: 技术栈 Multer 是一个node.js中间件,用于处理 multipart/form-data类型的表单数据,主要用于上传文件. 在fo ...

  7. matlab preloadfcn,运行xilinx blockset中的错误包含在matlab中

    xilinx 14.1和matlab2012a 当我打开一个系统生成器时,它会在matlab命令窗口中显示错误,如下所示: 警告:xbsIndex.mdl,第7行:评估block_diagram'xb ...

  8. 计算机视觉:Bag of words算法实现过程中出现错误及解决方案

    Bag of words算法实现过程中出现错误及解决方案 出现的问题 IndexError: list index out of range OSError:x.sift not found sqli ...

  9. 有关高级关系引擎中存在错误

    SQL server2005 Analysis Services项目中出现以下错误 高级关系引擎中存在错误. 无法与 DataSourceID 为"Adventure Works DW&qu ...

最新文章

  1. httpd服务相关实验
  2. PHP静态方法和属性
  3. iframe ajax上传,ajax--iframe模拟ajax文件上传效果
  4. 将数字字符串格式化为指定长度
  5. Altium Designer 的使用笔记
  6. 翻译SSD论文(Single Shot MultiBox Detector)
  7. TI Davinci DM6446开发攻略——开发环境搭建
  8. 【luogu P5022 旅行】 题解
  9. JavaScript数组排序详解
  10. layui.open 关闭之后触发_JAVA虚拟机关闭钩子(Shutdown Hook)
  11. Linq把一个DataTable根据一列去除重复数据
  12. 浅谈 光学字符识别(OCR识别)技术的前世今生...
  13. DOS系统和Windows系统的联系、对比和发展历程
  14. 如何将视频网站的视频下载为mp4格式
  15. 写作的感悟:低头走路与抬头看天
  16. 更改Google Chrome 用户文件存储目录User Data 最简单方法
  17. Android 圆形头像的两种实现方式
  18. Facebook开源的数据Mock:Memisis详解
  19. 2、JavaScript快速入门
  20. 3P21J30 2023年最新版车载版下载

热门文章

  1. java stream 取不同的数据_基础篇:JAVA.Stream函数,优雅的数据流操作
  2. python链表怎么定义_Python数据结构之双向链表的定义与使用方法示例
  3. python3 xpath_「手把手教python3接口自动化」:非结构化数据提取(二)
  4. 我的docker随笔16:构建一个特定的nodejs镜像
  5. 【java】java 一个线程占用多少内存
  6. 【Elasticsearch】java 操作 Elasticsearch 7.8 索引 文档 等操作
  7. 【ElasticSearch】es ResourceWatcherService 的 初始化 启动 源码解析
  8. Spark杀死我们提交的application
  9. 【正则表达式】正则匹配注释
  10. 【JVM】 讲的比较好的JVM博客连接