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

halcon知识:常见三种模板匹配方法总结 halcon的三种模板匹配方法总结,halcon有三种模板匹配方法:即Component-Based、Gray-Value-Based、Shaped_based,分别是基于组件(或成分、元素)的匹配,基于灰度值的匹配和基于形状的匹配,此外还有变形匹配和三维模型匹配也是分属于前面的大类 本文只对形状匹配做简要说明和补充: Shape_Based匹配方法: 上图介绍的是形状匹配做法的一般流程及模板制作的两种方法。 先要补充点知识:形状匹配常见的有四种情况 一般形状匹配模板shape_model、线性变 阅读详情

相关推荐

arduino uno spi驱动12864

arduino uno spi驱动12864

yvee的博客 2060

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

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

qq_29586575的博客 3778

GE Proficy Historian8.0历史数据库部署与配置全攻略

本文提供了GE Proficy Historian 8.0历史数据库的详细部署与配置指南。内容涵盖安装前的系统环境、权限与依赖检查,服务器安装的关键步骤与类型选择,采集器的安装配置与数据接入,以及客户端工具的使用与数据分析实战。旨在帮助用户规避常见陷阱,实现一次部署成功,构建稳定高效的工业数据归档平台。

silver的专栏 766

Express 错误处理

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

weijia_kmy的博客 559

硬件基础——mos管

文章目录前言一、寄生参数二、使用步骤1.引入库2.读入数据总结 前言 MOS管设计重点 一、寄生参数 1.寄生电容 mos管有寄生电容Cgs,此电容大小一般为pF级别,一般规格书可以查到。 使用时,要特别注意GS管教的寄生电容Cgs,控制MOS管的导通与截止,本质上是控制Cgs电容的充放电。(最好要加限流) 二、使用步骤 1.引入库 代码如下(示例): import numpy as np import pandas as pd import matplotlib.pyplot as plt imp

Malqaq的博客 6597

Claude Code 100个真实案例 - 用AI搭建LangChain多工具Agent(自主搜索+查询)

本案例展示如何使用 Claude Code 搭建一个 LangChain 多工具 Agent 系统。Agent 能够自主决定调用搜索引擎、数据库查询、天气查询、计算器等工具,像人类助手一样拆解问题并逐步解决。

yueyeguzhuo的专栏 559

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

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

我们的目标是星辰大海 5105

Cadence PCB 仿真宝典【目录】

欢迎大家来到《Cadence PCB 仿真宝典》该专栏包括【入门篇】【提升篇】【技巧篇】【疑难篇】四个部分,以供大家参考。大家直接点击大纲中的蓝色标题即可轻松传送。

fydar的博客 3269

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

Autosar Dcm配置-App到Boot的跳转及1002回复配置及实现-基于ETAS软件

在软件刷写流程中,上位机(诊断仪)发送1002后,APP检查允许跳转boot后,在特定的ram(软复位不清除)写入指定置后通过触发软件复位来跳转到boot的。在APP跳转到Bootloader时,1002的回复有两种方式,一种是APP直接回复,然后跳转,另一种是APP回复NRC78,然后跳转,在Boot中回复。本文介绍这两种方式的实现。如果是在APP中回复,可以少发一个0x78,整体跳转时间可能会少一些。但是如果诊断在收到5002之后立马请求其他的服务,可能出现boot正在初始化而未正常接收到报文。

赞的博客 1557

Python 爬虫实战:亚马逊商品评论 + 评分抓取(情感分析数据预处理)

在电子商务领域,用户评论是了解产品口碑和市场反馈的重要渠道。亚马逊作为全球领先的电商平台,拥有海量的商品评论数据。本文将详细介绍如何使用 Python 编写爬虫程序,从亚马逊网站抓取商品评论和评分数据,并进行情感分析的数据预处理。

yansideyucsdn的博客 769

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

汇川Easy系列PID_AT指令弹簧质量阻尼系统闭环控制仿真测试

汇川Easy系列PLC系统PID指令(温度控制PID应用编程)

RXXW_Dor的博客 763

解决方法: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万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【Express.js】express-validator

【Express.js】express-validator

Evanpatchouli 的博客 1649

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

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

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

qq_46063425的博客 2620

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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、付费专栏及课程。

余额充值