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之后,所有的接口都会首先经过这么一步解析,也无法对个别请求的参数检验进行个性化定制。

目前暂时只能想到这种解决办法,有后续的方法会持续更新。

转载于:https://www.cnblogs.com/zhangjpn/p/8322384.html

MTK平台 MT6789 烧录 efuse 3.0 Configuration SOP =====================生成cert1和cert2 key===============================================生成efuse key相关文件===========================================签名DA==========================================================正常编译。=====================Security3.0 的SOP 说明。 阅读详情

相关推荐

SystemVue 链路预算、仿真分析步骤

使用SystemVue进行链路预算、频谱分析等,相对ADS更全面。

BeCourageable的博客 3835

Express错误处理中间件的参数使用

Express中,错误处理通过特殊的中间件来完成。如前所述,一般中间件的参数为3个:req,res, next。如果你use一个4个参数的中间件,它将被Express视为错误处理中间件。下面便是一个错误处理中间件,当出于开发环境时使用: // file: app.js if (app.get('env') === 'development') { app.use(function

qq_29586575的博客 3778

AD20 Channel-Offset Error 解决办法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言AD20 PCB相同电路模块ROOM格式复用时出现 Channel-Offset Error 解决办法一、问题现象二、解决办法 前言 AD20 PCB相同电路模块ROOM格式复用时出现 Channel-Offset Error 解决办法 一、问题现象 我们经常在使用Room格式快速布局相同模块电路时出现以下问题, 二、解决办法 相同模块电路PCB布局复制的过程网上有很多,这里不再做赘述,步骤都差不多,只说问题根源; 1:.

m0_47201213的博客 7625

Express 错误处理

当我们在中间件中出现错误的时候,可以通过next(err)来传递。next一旦接收了err参数之后,就会去执行它的错误处理中间件(err, req, res, next)=>{},这个中间件是express提供的,和普通中间件不同的是,它接收4个参数。

weijia_kmy的博客 559

自绘CListCtrl时发现ON_WM_MEASUREITEM_REFLECT和DrawItem(LPDRAWITEMSTRUCT lpMeasureItemStruct) 无响应

自绘CListCtrl时发现ON_WM_MEASUREITEM_REFLECT和DrawItem(LPDRAWITEMSTRUCT lpMeasureItemStruct) 无响应 一般情况下,我们都是在 dialog 里面 放一个 list 控件,然后 用自己的类绑定自己的自绘对象,如同下面: 1.  在 dialog 里面 加一个 list 列表 2. 然后 绑定这个列表 哈哈...

mfreesky的专栏 2170

反制反心理特征的研究

抓牛股

m0_58032574的博客 908

访问express接口出现“原因: CORS 请求未成功”,“network error”错误

记录一下出现的问题,第二次出现这个问题了,看MDN说跟cors本身没关系,是网络的问题,但是在网上也没有找到解决的办法。 我在访问注册接口出现的问题,偶尔postman访问也失败,但是我真的找不到原因,有时候突然就好了,这个问题暂时不知道是为什么。 network error 出现的原因:查看console报错:TypeError: invalid parameter format,原因是前端传到后端的数据类型和数据库中数据类型不匹配,修改数据跟mysql所需类型一致后 两个报错均解决。 ...

我们的目标是星辰大海 5105

SAP PP未清生产订单关闭物料退料、新工单发料批量处理

( werks = '1001' lgort = 'A004' lgobe = '组装-成品组装' )( werks = '1002' lgort = 'C006' lgobe = '组装-二车间' )( werks = '1002' lgort = 'C007' lgobe = '组装-二车间' )( werks = '1001' lgort = 'A007' lgobe = '组装-MS' )( werks = '1001' lgort = 'A008' lgobe = '组装-GW' )

dingqing86的专栏 1192

Express-----express-validator数据验证

文章预览前言示例1、安装express-validator2、引入3、测试 前言 express-validation是一个中间件,它验证请求的body, params, query, headers 和 cookies ,并且如果任何配置的验证规则失败,返回一个错误的响应 官方文档:https://express-validator.github.io/docs/ 示例 1、安装express-validator npm install express-validator 2、引入 在路由文件中引入

niulinbiao的博客 3475

【控制模块路径跟踪算法】PID控制算法实现路径跟踪(附C++代码)

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对PID控制算法实现路径跟踪–飞思卡尔的方法做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容PID属于无模型控制,调节三个环节的参数会产生什么影响根据控制对象的不同也会有很大差别PID形象解释小明接到这样一个任务:有一个水缸点漏水(而且漏水的速度还不一定固定不变),要求水面高度维持在某个位置,一旦发现水面高度低于要求位置,就要往水缸里加水。

qq_35635374的博客 2386

以 Joule 驱动的生成式开发:把需求文档直接变成可运行的 SAP 应用

摘要:SAP BTP的AI助手Joule正在改变开发方式,支持从自然语言描述自动生成数据模型、服务、UI及测试代码。在SAP Business Application Studio中,Joule能根据业务需求生成结构化代码,并提供代码补全、重构、解释等功能。开发者需注意避免上传敏感数据,并对AI生成的代码进行人工审核。Joule特别针对ABAP开发进行了优化,提供符合SAP规范的代码建议,帮助迁移遗留系统。此外,它还能快速生成CAP项目原型,但所有AI生成内容都需经过严格测试验证。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 342

Express框架中的res

2.对获取http请求参数进行了简化处理; 3.对模板引擎支持程度高,方便渲染html页面; 4.提供了中间件机制有效控制http请求; 5.拥有大量第三方中间件对功能进行扩展; [](()1.res.send()方法响应 //引入express模块 //返回值是一个方法 const express = require(‘express’); //创建网站服务器 const app = express(); app.get(‘/’,(req,res)=>{ //send()方法 自动监测响应类型,帮

m0_70521709的博客 745

华为OD机试真题2026双机位C卷 Java&Go 实现【用户入网定期复评】

用户开立支付账户,在开户完成后立即对用户进行一次风险模型评级,输出一个评分风险,评分范围1-100,等区间的分为5个等级,1-19为等级1,20-39为等级2,40-59为等级3,60-79为等级4,80-100为等级5,系统每天会任务对全量入网用户进行计算复评时间,输出评分给出新的风险等级。复评规则如下:

MISAYAONE的博客 148

解决方法:Invalid mime type “properties;charset=UTF-8“: does not contain ‘/‘

报错如下: 16:09:36.221 [http-nio-8080-exec-1] ERROR c.k.f.w.e.GlobalExceptionHandler - [handleException,83] - Invalid mime type "properties;charset=UTF-8": does not contain '/' org.springframework.http.InvalidMediaTypeException: Invalid mime type "properties

boboxu 1万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【Express.js】express-validator

【Express.js】express-validator

Evanpatchouli 的博客 1649

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

发送post请求,服务器端不能解析到body的参数

发送post请求,服务器端不能解析到body的参数? 说来也奇怪,浏览器发送的get请求,都能够成功获取到它携带的参数,那为什么使用到post发送请求就出现了找不到携带的参数。甚至连body都是undefined!!!。 翻箱倒柜,折腾的一上午,也算是找到了一种解决办法。 原来我们发送到post请求携带的body,是需要在服务端进行解析的,不然在后台对请求进行处理的时候就会查看不到body携带的参数,甚至连body都是一个undefined值。so,看下的操作: 1、下载依赖包npm i body-par

qq_46063425的博客 2620

node 后台接口报错 TypeError: invalid media type问题

从来没遇到过这个问题,并且估计自己以后还会遇到这个问题,所以发文章记录一下。 报错的原因是前后端的请求头没有对应上,解决方法 app.all('*',function(req, res, next) {//处理跨域 res.header("Access-Control-Allow-Origin","*"); res.header("Access-Control-Allow-Headers...

Lee的博客 4088

express 中的错误处理

node中错误处理 node中抛出一个uncaughtException应该要让node进程直接结束。而不是通过process.on('uncaughtException',handler)进行统一处理。 如果真要全局捕获错误,可以像下面这样处理: process .on('unhandledRejection', (reason, p) => { console.error(r...

qq_36391954的博客 7416

订单信息无法识别,建议联系卖家。 错误码:INVALID_PARAMETER

报错原因: 参数格式不对 biz_Content:{ out_trade_no:' ',// 订单号 product_code: 'FAST_INSTANT_TRADE_PAY', // 商品码 total_amount: ' ', // 商品价格 subject: goods.' ', // 商品名称 timeout_express: '5m', // 超时时间 passback_pa...

做一个有知识的人的博客 1万+

Express4.x中res.format()的用法

res.format的作用是根据request heards所能接受的格式,来响应不同的内容。来看个例子:这是服务端路由程序 router.jsvar express = require('express'); router.get('/', function (req, res) { res.send('this is a router base page!'); });router.ge

sunq1982的博客 1329

[转] JSON数据解析错误处理办法!

-JSONValue failed. Error is: Unescaped control character [0x0D] 这个错误就是JSON解析的时候String 的时候出现转义字符。 对应用NSString 里的stringByReplacingOccurrencesOfString:@"\r"withString:@"" 取消掉转义字符就OK那! NSString *js...

weixin_34122548的博客 639

NodeJs - Express 中间件修改 Header: TypeError [ERR_INVALID_CHAR]: Invalid character in header content

背景 使用 Express 中间件进行数据代理方法,用户信息统一使用 Redis 缓存 user-redis const user_redis = async function (req, res, next) { const token = req.headers['authorization'] const user = await redis.client.getAsyn...

原小明 2万+

nodejs后端接口参数格式校验——Joi

在nodejs做后端开发的过程中,尤其是基于Restful的API服务,在前端发起请求的时候,如果没有对参数的校验,很容易在接口联调测试阶段出现各种上传参数名称错误/格式错误/字段遗漏等情况,这时候前后端工程师不得不一起去排查问题,有时候一个单词的拼写错误会造成大量的时间浪费,笔者在阅读《hapi.js实战》的时候了解到Joi这个包,感觉非常好用,于是团队引入了express的研发框架中,真的是好...

weixin_33694172的博客 6469

【原创】vue+express axios请求通过后返回内容为空的问题

这个项目是个人用vue+express做为练手的第二个项目了,结果一开始就卡住了。问题如下 一开始 我使用vue-cli创建一个客户端的项目 再用express创建一个服务端的项目 然后写了个简单的请求 vue中内容如下 1 main.js中对axios的引用中出对请求地址定义 2 在一个vue中提发送请求 3 在node中接受请求 问题来了 上图中的“hello get”能在git bas...

大象的博客 8639

Jackson 序列化 / 反序列化注解 完整版笔记

Jackson 序列化 / 反序列化注解 完整版笔记

handsome_sai的博客 275
上一篇: Nodejs将Buffer转化成Stream
下一篇: Nginx 兼容IE8
dinght2000
博客等级 码龄11年 3粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值