Node.js中查询字符串中的多种类型

时间:2018-12-11 06:31:15

标签: node.js express parsing request.querystring

我正在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对象是动态的,它可以包含任意数量的对象,数组,布尔值,数字或字符串。有什么办法吗?

1 个答案:

答案 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
}