网页无法通过get方法传递数字参数给js后台,就是网页端写的是数字参数,传递给后台也变成了数字字符串。而js对数字类型和字符串类型是不相同的。由于我们的代码是通过中间件挂载接口的,通过joi库检查参数。
const Joi = require('joi');
//注意:pageSize为0代表不拉取列表数据,只是获取页面总数
const pagingJoi = {
page: Joi.number().min(1).required().error(new Error('页码不能小于1')),
pageSize: Joi.number().min(0).required().error(new Error('页码数量不能小于0')),
};
const queryTestSchema = Joi.object({
page: pagingJoi.page,
pageSize: pagingJoi.pageSize,
});
使用的代码如下:
@route('GET', '/erp/queryTest')
@middleware(validateSchemaJoi(queryTestSchema))
async qqueryTest(ctx) {
const data = Util.getRequestData(ctx);
const result = await StatisticsConsultantService.queryTest(data);
return ctx.cc('查询成功', true, result);
}
当用get请求传递参数时,数字类型的参数page和pageSize会被自动转换成字符串类型。导致校验失败。
解决方案一:把请求修改为POST请求;
方案二:不用中间件校验数字参数,在处理函数强制转换成数字类型,再在里面进行校验。
page = Number(page);
pageSize = Number(pageSize);
同理,当网页通过get请求给后台传递一个数组对象也会被转化为字符串类型。采用post方式可以传递数组类型的对象。