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 ...
随机推荐
- html+css调用服务器端字体
在浏览网页时,由于客户端没有安装某些特殊字体,导致网页文字无法按设计正常显示,这时我们可以使用服务器字体来避免这种现象的发送 语法 @font-face { /* 自定义字体名称 */ font-fa ...
- PJSIP-PJLIB-Socket
As we all know,most our projects are need to use the socket to programme.Use socket we can connect o ...
- 找出Xcode没有使用的图片
#! /bin/sh PROJ=`find . -name '*.xib' -o -name '*.[mh]'` for png in ` find . -name '*.png'` do name ...
- 使用闭包和lambda解决问题与常规方式解决问题的对比。
先来描述一下问题吧,游戏中的物品原来只有一个属性加成:攻击,防御,获得经验加成,金币加成,等等.现在要增加一个属性,这个属性可以为之前的属性之一. 这个属性加成涉及到类里的三个属性,value,typ ...
- activiti并发多实例子流程任务处理
一直在搞工作流(activiti),总结一下关于工作流(activiti)中同时并发处理多个子流程的操作方法. 先说下我要实现的业务: 1.办公室发通知(在系统申报页面上,勾选科室,被选中的科室执行第 ...
- day02-python基础2
操作 列表是用来存储一组数据,可以实现对列表中元素的增删改查等操作. 转换: list(string):把字符串转为列表 声明: 列表使用方括号 查询: 根据元素下标获取列表中元素的值 切片: [0: ...
- hnust 原石法阵
问题 F: 原石法阵 时间限制: 1 Sec 内存限制: 128 MB提交: 1098 解决: 161[提交][状态][讨论版] 题目描述 WZH有一个由原石构成的n阶三角形魔法阵,三角形魔法阵如 ...
- Struts2+DAO层实现实例02——搭建DAO基本框架并与Struts2组合
实例内容 创建DAO(Data Access Oject)接口:BaseDAO 创建其实例化类:UserDAO 用于获取数据库struts中的userinfo表中的内容 创建User的Java Bea ...
- 【bzoj1270】[BeijingWc2008]雷涛的小猫 dp
题目描述 输入 输出 样例输入 样例输出 8 题解 dp 设f[i][j]表示在第i棵树的j高度时最多吃到的柿子数. 那么只有两种可能能够到达这个位置:滑下来.跳下来. 滑下来直接用f[i][j+ ...
- [洛谷P4149][IOI2011]Race
题目大意:给一棵树,每条边有边权.求一条简单路径,权值和等于$K$,且边的数量最小. 题解:点分治,考虑到这是最小值,不满足可减性,于是点分中的更新答案的地方计算重复的部分要做更改,就用一个数组记录前 ...