Express定制参数解析错误响应值

Posted 门前大树下,路过一群鸭

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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定制参数解析错误响应值的主要内容,如果未能解决你的问题,请参考以下文章

Express实战 - 应用案例- realworld-API - 路由设计 - mongoose - 数据验证 - 密码加密 - 登录接口 - 身份认证 - token - 增删改查API(代码片段

片段(Java) | 机试题+算法思路+考点+代码解析 2023

Nodejs - Express JSON 解析器无法响应

10.FastAPI响应体

如何在 express/node js 中发送错误 http 响应?

Node.js - Express.js JWT 总是在浏览器响应中返回一个无效的令牌错误