Express定制参数解析错误响应值
Nodejs的Express框架本身所提供的东西并没有其它框架那么多。其中的一个问题就是对于请求数据的解析。
express中的请求对象并没有未经过解析的请求体,几乎所有的请求体都要经过类似于body-parser这类包来实现对其解析。
例如,像请求体是json格式的数据,而Content-Type: application/json时,body-parser会将请求体作为json字符串解析成为一个对象,并赋值给req.body。代码如下:
const bodyParser = require('body-parser');
app.route('/path').post(bodyParser.json(), function(req, res){res.end('1')});
但此处有个问题,就是当客户端发起的请求中请求体不合法的时候,应用程序将会500内部错误。其原因在于bodyParser.json()认为请求体是合法的json字符串,而没有考虑到错误的情况。
我们希望在客户端请求内容无效的时候可以返回相应的提示信息而不是内部错误,一种不太完美的方法是使用bodyParser.json()的verify参数:
const bodyParser = require('body-parser');
const jsonParse = bodyParser.json({
verify: function(req, res, buf, encoding){
try{
res.body = buf.toString();
}catch(err){
return res.json({code:'1',status:"Invalid Parameters"})
}
}
})
app.route('/path').post(jsonParse, function(req, res){res.end('1')});
这种方法在参数不合法的时候返回预期的响应,不至于将服务器的错误暴露出来。这种在应用程序内部还是会触发异常,这个异常出现在res.json()中,程序会提示响应头在设置了之后不能再改动。也就是在bodyParser.json()这个响应体的内部产生了两次对res响应体的操作,一次是verify,一次是将内容向json转化的时候。
另一种解决方法是不使用bodyParser.json(),而使用body.raw(),配合自定义的json解析函数进行实现前述的功能:
const bodyParser = require('body-parser');
const rawParse = bodyParser.raw({
type: "*/*",
verify: function(req, res, buf, encoding){
res.raw = buf.toString();
})
})
const jsonParse = function(req, res, next){
try{
req.body = JSON.parse(req.raw);
}catch(err){
return res.json({code:"-1", status:"Invalid Parameters"})
}
}
app.route('/path').post(rawParse, jsonParse, function(req, res){res.end('1')});
这样就可以解决前述请求体类型错误所导致错误。当然这种方法目前只能用于接口数量比较少的情况,在接口数量十分多的情况下,相较于app.use(bodyParser.json()),就显得十分笨拙了。
但由于使用了app.use之后,所有的接口都会首先经过这么一步解析,也无法对个别请求的参数检验进行个性化定制。
目前暂时只能想到这种解决办法,有后续的方法会持续更新。
Express定制参数解析错误响应值的更多相关文章
- springmvc 源码分析(三) -- 自定义处理器映射器和自定义处理器适配器,以及自定义参数解析器 和错误跳转自定页面
测试环境搭建: 本次搭建是基于springboot来实现的,代码在码云的链接:https://gitee.com/yangxioahui/thymeleaf.git DispatcherServlet ...
- Dubbo 泛化调用的参数解析问题及一个强大的参数解析工具 PojoUtils
排查了3个多小时,因为一个简单的错误,发现一个强大的参数解析工具,记录一下. 背景 Nodejs 通过 tether 调用 Java Dubbo 服务.请求类的某个参数对象 EsCondition 有 ...
- Zookeeper + Hadoop2.6 集群HA + spark1.6完整搭建与所有参数解析
废话就不多说了,直接开始啦~ 安装环境变量: 使用linx下的解压软件,解压找到里面的install 或者 ls 运行这个进行安装 yum install gcc yum install gcc-c+ ...
- argparse - 命令行选项与参数解析(转)
argparse - 命令行选项与参数解析(译)Mar 30, 2013 原文:argparse – Command line option and argument parsing 译者:young ...
- 扩展Python模块系列(三)----参数解析与结果封装
在上一节中,通过一个简单的例子介绍了C语言扩展Python内建模块的整体流程,从本节开始讲开始深入讨论一些细节问题,在细节讨论中从始至终都会涉及[引用计数]的问题.首先讨论C语言封装的Python函数 ...
- SpringMVC源码之参数解析绑定原理
摘要 本文从源码层面简单讲解SpringMVC的参数绑定原理 SpringMVC参数绑定相关组件的初始化过程 在理解初始化之前,先来认识一个接口 HandlerMethodArgumentResolv ...
- python命令行参数解析模块argparse和docopt
http://blog.csdn.net/pipisorry/article/details/53046471 还有其他两个模块实现这一功能,getopt(等同于C语言中的getopt())和弃用的o ...
- Java Main参数解析(Args4j)
最近实现一个工具,Main函数会有很多参数,而且参数类型不同,为了统一解析,网上找到三方工具类Args4j,轻松搞定. 代码实例如下: 定义解析类: import java.io.File impor ...
- gin的url查询参数解析
gin作为go语言最知名的网络库,在这里我简要介绍一下url的查询参数解析.主要是这里面存在一些需要注意的地方.这里,直接给出代码,和运行结果,在必要的地方进行分析. 代码1: type Struct ...
随机推荐
- laravel5.5服务提供器
目录 1. 编写服务提供器 1.1 注册方法 register 1.1.1 简单绑定 1.1.2 绑定单例 1.1.3 绑定实例 1.1.4 绑定初始数据 1.2 引导方法 boot 2. 注册服务提 ...
- linux下解压命令大全[转]
本文是复制大神的博文, 供自己参考. 原文出处:http://www.cnblogs.com/eoiioe/archive/2008/09/20/1294681.html .tar 解包:tar xv ...
- GCD那些事儿
GCD GCD,全名Grand Central Dispatch,中文名郭草地,是基于C语言的一套多线程开发API,一听名字就是个狠角色,也是目前苹果官方推荐的多线程开发方式.可以说是使用方便,又不失 ...
- 《Cracking the Coding Interview》——第6章:智力题——题目1
2014-03-19 06:40 题目:有20瓶药,其中19瓶装的都是1.0克的药片,只有1瓶装了1.1克的药.给你一个能称出具体克数的电子秤,只允许你称一次,怎么找出那瓶不一样的? 解法:如果药片管 ...
- 《数据结构》C++代码 邻接表与邻接矩阵
上一篇“BFS与DFS”写完,突然意识到这个可能偏离了“数据结构”的主题,所以回来介绍一下图的存储:邻接表和邻接矩阵. 存图有两种方式,邻接矩阵严格说就是一个bool型的二维数组,map[i][j]表 ...
- 异步fifo的设计(FPGA)
本文首先对异步 FIFO 设计的重点难点进行分析 最后给出详细代码 一.FIFO简单讲解 FIFO的本质是RAM, 先进先出 重要参数:fifo深度(简单来说就是需要存多少个数据) ...
- HDU 4725 The Shortest Path in Nya Graph( 建图 + 最短路 )
主要是建图,建好图之后跑一边dijkstra即可. 一共3N个点,1~N是原图中的点1~N,然后把每层x拆成两个点(N+x)[用于连指向x层的边]和(N+N+x)[用于连从x层指出的边]. 相邻层节点 ...
- c++ object model
对一个结构体进行不断的封装后可以形成一个c++类,为此需要添加很多函数成员之类的代码,为此显示c++比c语言显得庞大并且迟缓,但是事实并不是这些 c++在布局和时间上的额外承担主要是由virtual引 ...
- Linux自学系列 -- 常用指令的使用
1.查看目录下内容>ls //列出目录下的文件信息>ls -l //以“详细信息"查看目录文件>ls -a //查看目录“全部”(包括隐藏文件)文件> ...
- 【转】Unity3D 关于贝赛尔曲线,平滑曲线,平滑路径,动态曲线
http://tieba.baidu.com/p/2460036481 很多时候我们需要的并不是直线和折线,而是平滑的曲线,比如寻路系统,某些物体的曲线运动,都需要平滑曲线来保证效果,今天试了一下,通 ...