Несколько типов в строке запроса в nodejs - PullRequest
0 голосов
/ 11 декабря 2018

Я создаю API-интерфейс get в nodejs. Я запрашиваю следующий URL

http://localhost:8080/api?id=20&condition1=true&arr=[{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 голосов
/ 11 декабря 2018

Эта функциональность не поставляется из коробки с 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()
    }
}

Имея эту схему, вы можете присоединить ее к вашему экспресс-методу и использовать 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
}
...