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定制参数解析错误响应值的更多相关文章

  1. springmvc 源码分析(三) -- 自定义处理器映射器和自定义处理器适配器,以及自定义参数解析器 和错误跳转自定页面

    测试环境搭建: 本次搭建是基于springboot来实现的,代码在码云的链接:https://gitee.com/yangxioahui/thymeleaf.git DispatcherServlet ...

  2. Dubbo 泛化调用的参数解析问题及一个强大的参数解析工具 PojoUtils

    排查了3个多小时,因为一个简单的错误,发现一个强大的参数解析工具,记录一下. 背景 Nodejs 通过 tether 调用 Java Dubbo 服务.请求类的某个参数对象 EsCondition 有 ...

  3. Zookeeper + Hadoop2.6 集群HA + spark1.6完整搭建与所有参数解析

    废话就不多说了,直接开始啦~ 安装环境变量: 使用linx下的解压软件,解压找到里面的install 或者 ls 运行这个进行安装 yum install gcc yum install gcc-c+ ...

  4. argparse - 命令行选项与参数解析(转)

    argparse - 命令行选项与参数解析(译)Mar 30, 2013 原文:argparse – Command line option and argument parsing 译者:young ...

  5. 扩展Python模块系列(三)----参数解析与结果封装

    在上一节中,通过一个简单的例子介绍了C语言扩展Python内建模块的整体流程,从本节开始讲开始深入讨论一些细节问题,在细节讨论中从始至终都会涉及[引用计数]的问题.首先讨论C语言封装的Python函数 ...

  6. SpringMVC源码之参数解析绑定原理

    摘要 本文从源码层面简单讲解SpringMVC的参数绑定原理 SpringMVC参数绑定相关组件的初始化过程 在理解初始化之前,先来认识一个接口 HandlerMethodArgumentResolv ...

  7. python命令行参数解析模块argparse和docopt

    http://blog.csdn.net/pipisorry/article/details/53046471 还有其他两个模块实现这一功能,getopt(等同于C语言中的getopt())和弃用的o ...

  8. Java Main参数解析(Args4j)

    最近实现一个工具,Main函数会有很多参数,而且参数类型不同,为了统一解析,网上找到三方工具类Args4j,轻松搞定. 代码实例如下: 定义解析类: import java.io.File impor ...

  9. gin的url查询参数解析

    gin作为go语言最知名的网络库,在这里我简要介绍一下url的查询参数解析.主要是这里面存在一些需要注意的地方.这里,直接给出代码,和运行结果,在必要的地方进行分析. 代码1: type Struct ...

随机推荐

  1. PHP.TP框架下商品项目的优化3-php封装下拉框函数

    php封装下拉框函数 因为在项目中会经常使用到下拉框,所以根据一个表中的数据制作下拉框函数,以便调用 //使用一个表的数据做下拉框函数 function buildSelect($tableName, ...

  2. python sys模块和序列化模块

    sys模块是与python解释器交互的一个接口: sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0),错误退出sys.exit( ...

  3. laravel5.5缓存系统

    目录 1 Redis的配置 1.1 安装PRedis 1.2 配置 1.2.1 配置redis数据库 1.2.2 更改session的配置 1.2.3 更改cache配置 1.3 使用redis 2 ...

  4. 剑指Offer - 九度1508 - 把字符串转换成整数

    剑指Offer - 九度1508 - 把字符串转换成整数2014-02-06 23:46 题目描述: 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 输入: 输入可能包含多个测试样例 ...

  5. USACO Section1.5 Prime Palindromes 解题报告

    pprime解题报告 —— icedream61 博客园(转载请注明出处)--------------------------------------------------------------- ...

  6. webstrom11 vue插件配置

    直接上图 1. 安装vue插件 2.添加模板 3.指定模板类型 最新的是插件 是 vue.js 创建完 Vue File 文件后 需要在 下面这里关联一下

  7. Python写的计算器程序(主要目的在于熟悉下正则表达式)

    import res = '1-2*((60-30-(-40/5)*(9-2*5/3-7/3*99/4*2998-10*568/14.3))+(-4*3)/16-3)'s2 = 1-2*((60-30 ...

  8. python之上下文管理、redis的发布订阅、rabbitmq

    使用with打开文件的方式,是调用了上下文管理的功能 #打开文件的两种方法: f = open('a.txt','r') with open('a.txt','r') as f 实现使用with关闭s ...

  9. nodejs下载图片到本地,根据百度图片查找相应的图片,通过nodejs保存到本地文件夹

    根据百度图片查找相应的图片:输入图片关键字,输入图片数量(默认是30条),通过nodejs将批量保存图片到本地文件夹. 代码已上传到github上:代码github的地址 下载后进去back-end: ...

  10. 【Python】重定向 Stream 到文件

    Python 系统模块 sys 中有三个变量 stdin . stdout 与 stderr ,分别对应标准输入流.输出流与错误流.stdin 默认指向键盘, stdout 与 stderr 默认指向 ...