如何在SuperTest请求中发送数字类型查询参数?
解决SuperTest发送数字查询参数被后端识别为字符串的问题
问题根源
HTTP查询参数本身没有类型区分,本质都是字符串。Postman发送请求时,后端的参数解析器(比如用了qs库)会自动把看起来像数字的字符串转成数字类型;但SuperTest默认用Node.js内置的querystring模块序列化参数,不会做类型转换,所以numberProperty: 1会被转成numberProperty=1字符串发送,后端收到的就是字符串类型,触发校验失败。
解决办法
办法1:让后端配置自动类型转换的参数解析器
如果后端用Express框架,把默认的查询参数解析换成qs库:
const express = require('express'); const app = express(); // 用qs解析查询参数,自动转换数字、布尔等类型 app.use(express.urlencoded({ extended: true }));
这样不管是SuperTest还是Postman的请求,后端都会自动把符合数字格式的查询参数转成number类型。
办法2:在SuperTest中手动用qs序列化参数
- 先安装
qs库:
npm install qs --save-dev
- 在测试代码中用
qs序列化查询参数后再传给query方法:
const qs = require('qs'); const request = require('supertest'); request('http://the-url.com/some-path') .get("/") .query(qs.stringify({ numberProperty: 1 }))
qs序列化时会保留参数的类型信息,后端用支持类型转换的解析器就能识别出数字类型。
办法3:后端校验时兼容字符串格式的数字
如果不想改前端测试或解析配置,可以调整后端的校验规则,允许字符串格式的数字,比如用Joi的话:
const schema = Joi.object({ numberProperty: Joi.alternatives().try(Joi.number(), Joi.string().pattern(/^\d+$/)).required() });
不过这种办法只是兼容,不如前两种从根源解决问题。
内容的提问来源于stack exchange,提问作者Coco
相关产品推荐
相关产品推荐

