express中的错误处理
错误处理
定义错误处理中间件和定义其他中间件一样,除了需要 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中的错误处理相关推荐
- 快递拒收后怎么处理_如何处理快递中的错误
快递拒收后怎么处理 If you use Express to develop your application, you probably thinking about Errors handlin ...
- 【node】express中mysql的基本用法、连接池的使用、事务的回滚
[node]express中mysql的基本用法.连接池的使用 安装mysql包 mysql的配置信息 mysql基本操作 查询mysql并渲染数据 mysql插入操作 首先在html页面写上< ...
- 解决SQL Server 2005 Express中无法连接到服务器问题
问题描述: 操作系统Windows XP SP2,在SQL Server Management Studio Express 中,以SQL Server验证模式用sa登录,出现无法连接到服务器问题. ...
- GraphQL学习第三篇 -在Express中使用GraphQL
在Express中使用GraphQL主要有以下几步: 1. 安装 graphql 和 express-graphql: 2. 引入express-graphql: 3. 引入自定义的schema,其中 ...
- Outlook Express出0x800C0133错误的解决
一电脑Outlook Express收公司邮箱一直出下面的错误: 出现未知错误. 帐户: 'mail.xxxxxxx.com', 服务器: 'mail.xxxxxxx.com', 协议: POP3, ...
- multer 文件上传系统在express中的使用
multer 文件上传系统在express中的使用 参考: 技术栈 Multer 是一个node.js中间件,用于处理 multipart/form-data类型的表单数据,主要用于上传文件. 在fo ...
- matlab preloadfcn,运行xilinx blockset中的错误包含在matlab中
xilinx 14.1和matlab2012a 当我打开一个系统生成器时,它会在matlab命令窗口中显示错误,如下所示: 警告:xbsIndex.mdl,第7行:评估block_diagram'xb ...
- 计算机视觉:Bag of words算法实现过程中出现错误及解决方案
Bag of words算法实现过程中出现错误及解决方案 出现的问题 IndexError: list index out of range OSError:x.sift not found sqli ...
- 有关高级关系引擎中存在错误
SQL server2005 Analysis Services项目中出现以下错误 高级关系引擎中存在错误. 无法与 DataSourceID 为"Adventure Works DW&qu ...
最新文章
- httpd服务相关实验
- PHP静态方法和属性
- iframe ajax上传,ajax--iframe模拟ajax文件上传效果
- 将数字字符串格式化为指定长度
- Altium Designer 的使用笔记
- 翻译SSD论文(Single Shot MultiBox Detector)
- TI Davinci DM6446开发攻略——开发环境搭建
- 【luogu P5022 旅行】 题解
- JavaScript数组排序详解
- layui.open 关闭之后触发_JAVA虚拟机关闭钩子(Shutdown Hook)
- Linq把一个DataTable根据一列去除重复数据
- 浅谈 光学字符识别(OCR识别)技术的前世今生...
- DOS系统和Windows系统的联系、对比和发展历程
- 如何将视频网站的视频下载为mp4格式
- 写作的感悟:低头走路与抬头看天
- 更改Google Chrome 用户文件存储目录User Data 最简单方法
- Android 圆形头像的两种实现方式
- Facebook开源的数据Mock:Memisis详解
- 2、JavaScript快速入门
- 3P21J30 2023年最新版车载版下载
热门文章
- java stream 取不同的数据_基础篇:JAVA.Stream函数,优雅的数据流操作
- python链表怎么定义_Python数据结构之双向链表的定义与使用方法示例
- python3 xpath_「手把手教python3接口自动化」:非结构化数据提取(二)
- 我的docker随笔16:构建一个特定的nodejs镜像
- 【java】java 一个线程占用多少内存
- 【Elasticsearch】java 操作 Elasticsearch 7.8 索引 文档 等操作
- 【ElasticSearch】es ResourceWatcherService 的 初始化 启动 源码解析
- Spark杀死我们提交的application
- 【正则表达式】正则匹配注释
- 【JVM】 讲的比较好的JVM博客连接