我正在nodejs中创建一个get api。我正在请求以下URL
Why not expose a primary key {prop1:1}]&obj = {a:1,b:2} 我得到的请求查询对象如下-
req.query = {
arr:"[{prop1:1}]",
condition1:"true",
id:"20",
obj:"{a:1,b:2}"
}
我想将查询对象键转换为适当的类型。我的查询对象应转换为
req.query = {
arr:[{prop1:1}], // Array
condition1:true, // Boolean
id:20, // Number
obj: {a:1,b:2} //Object
}
req.query对象是动态的,它可以包含任意数量的对象,数组,布尔值,数字或字符串。有什么办法吗?
答案 0 :(得分:0)
express
和查询参数并不是开箱即用的功能。
问题是,为了使查询字符串解析器知道"true"
是实际的布尔值true
还是字符串"true"
,它需要某种类型的Schema
查询对象以帮助解析字符串。
选项A
我推荐使用Joi。
在您的情况下,它看起来像:
const Joi = require( "joi" );
const querySchema = {
arr: Joi.array(),
condition1: Joi.boolean(),
id: Joi.number(),
obj: {
a: Joi.number(),
b: Joi.number()
}
}
具有此架构,您可以将其附加到您的express方法上,并使用Joi.validate
对其进行验证。
function getFoo( req, res, next ) {
const query = req.query; // query is { condition1: "true" // string, ... }
Joi.validate( query, querySchema, ( err, values ) => {
values.condition1 === true // converted to boolean
} );
}
选项B
正确键入GET请求的另一种方法是欺骗查询参数,仅提供字符串化的JSON。
GET localhost/foo?data='{"foo":true,"bar":1}'
这将使您可以解析请求查询
function getFoo( req, res, next ) {
const data = JSON.parse( req.query.data )
data.foo // boolean
data.bar // number
}