【Express.js】处理请求数据( 二 )


接口测试
请使用接口调试工具,带上JSON请求体,去POST访问 :8080//data/body/kind,修改不同的kind,看看它们的返回结果
获取路径参数 基础
路径参数是指 ‘/url?id=1&name=evanp’ 这种url中的id和name,是明文的不具有隐私性
可以通过 req.query获取
app.post('/request/data/query/info',checkQuery, (req, res)=> {res.send(req.query);});

【Express.js】处理请求数据

文章插图
尝试用接口调试工具访问 :8080//data/query/info,并携带上任意的query参数
Query预检
在实际场景中,每个接口会指定需要哪些名字的query参数,假设上面的接口需要id和name,则需要保证前端确实给接口传递了这两个query参数,没有像那样在入参的时候就可以规定检验,我们必须亲自对传过来的query进行检验 。而这部分检验的操作不建议包含在我们接口的主体回调函数内,而应作为一个中间件,在回调之前就完成检验:
定义一个检查query的函数,判断是否有id和name,是的话继续,不是的话直接返回错误信息
function checkQuery(req,res,next) {if (req.query.id == undefined ||req.query.id == null ||req.query.name == undefined ||req.query.name == null){res.send({"msg": "query不齐全"});} else {next();}}
在接口入参时引入该中间件函数
app.post('/request/data/query/info',checkQuery, (req, res)=> {res.send(req.query);});
尝试用接口调试工具访问 :8080//data/query/info,并比较不携带id,name和携带了id,name的返回结果
【【Express.js】处理请求数据】获取请求体 JSON请求体
引入以下代码一次即可
app.use(express.json({type: 'application/json'}));
表单(x-www-form-)
x-www-form-将表单数据编码为URL形式的字符串
引入以下代码一次即可
app.use(express.urlencoded({extended: true}));
关于参数,是指将(URL编码字符串形式的)表单数据解析为简单对象还是深度嵌套对象.
什么意思呢?就比如当=false时,表单里是这么传数据的:
其中,有两个相同的键名: 比如传了2个x
解析后该字段的指将是所有它们的值的数组集合:x=1&x=2 -> {'x': ['1','2']},即便2个x都为1,也是数组: {'x': ['1','1']}
其中,又有的键名是以对象属性格式传递的,比如下图的user[uname]:
假如我们在api调试工具访问之前那个body/form-接口,同时以表单方式传输了这两种情况的数据,将得到这样的返回结果:
[{"name": "lesson","value": "form-urlencode请求体"},{"name": "body","value": {"user[uname]": "evanp","user[passwd]": "iloveu","x": ["1","2"]}}]
当=true时,则是:
[{"name": "lesson","value": "form-urlencode请求体"},{"name": "body","value": {"user": {"uname": "evanp","passwd": "iloveu"},"x": ["1","2"]}}]
通过对比我们可以发现,=false时比较憨,不会智能解析user到一个对象上去;智能解析的用处,我想大概是省的我们手动一条条注入属性到对象上去了
表单验证
对于请求参数我们有验证的需求,同样的,表单验证自然也会有,甚至可能需求性更高,因为需要考虑到安全问题
如果没有什么特殊要求,可以自己写一个中间件函数来检查表单,如果有比较高级的需求,可以借助线程的js库,如-等