2016-03-21 3 views
5

У меня возникла проблема проверки JSON, которая передается в параметре запроса запроса GET как сериализованная строка.Проверка строки запроса JSON в качестве параметра запроса с помощью Joi

Что мне нужно, так это разобрать эту сериализованную строку обратно в JSON и проверить ее с помощью Joi.

Пример: Дайте это JSON

{ 
limit: {size:10, page:0}, 
filter: {filter_by: 'foo', filter_val: 'foo', from: '1/1/2016',to: '1/1/2016' } 
} 

И это JSON преобразуется в строку запроса является:

limit%5Bsize%5D=10&limit%5Bpage%5D=0&filter%5Bfilter_by%5D=foo&filter%5Bfilter_val%5D=foo&filter%5Bfrom%5D=1%2F1%2F2016&filter%5Bto%5D=1%2F1%2F2016 

мне нужно что-то вроде этого, чтобы проверить:

validate: { 
      query: { 
      limit: Joi.someMethodToGetJsonFromString.object().keys({ 
       size: Joi.number(), 
       page: Joi.number() 
      } 
      filter: Joi.someMethodToGetJsonFromString,.object().keys({ 
       filter_by: Joi.string().valid(['option1', 'option2']), 
       filter_val: Joi.string(), 
       from: Joi.date(), 
       to: Joi.date(), 
      } 
     } 

ли есть что-нибудь в Joi, которое может помочь в этом сценарии, или мне нужно написать для него специальные функции проверки.

ответ

3

Вы хотите поменять синтаксический анализ строки запроса, потому что hapi не поддерживает этот формат по умолчанию. Он просто использует Node, встроенный в модуль url, для анализа URL-адреса, который не поддерживает сложные кодировки строк запроса. Вам нужно будет вручную разобрать его с помощью qs, после чего вы сможете проверить его как обычно.

const Hapi = require('hapi'); 
const Joi = require('joi'); 
const Url = require('url'); 
const Qs = require('qs'); 

const server = new Hapi.Server(); 
server.connection({ port: 4000 }); 

const onRequest = function (request, reply) { 

    const uri = request.raw.req.url; 
    const parsed = Url.parse(uri, false); // skip the querystring parsing 
    parsed.query = Qs.parse(parsed.query); // parse it ourselves with qs 
    request.setUrl(parsed); 

    return reply.continue(); 
}; 

server.ext('onRequest', onRequest); 

server.route({ 
    config: { 
     validate: { 
      query: { 
       limit: Joi.object().keys({ 
        size: Joi.number(), 
        page: Joi.number() 
       }), 
       filter: Joi.object().keys({ 
        filter_by: Joi.string().valid(['option1', 'option2']), 
        filter_val: Joi.string(), 
        from: Joi.date(), 
        to: Joi.date(), 
       }) 
      } 
     } 
    }, 
    method: 'GET', 
    path: '/', 
    handler: function (request, reply) { 

     return reply('ok'); 
    } 
}); 

server.start((err) => { 

    if (err) { 
     throw err; 
    } 
    console.log('Started server'); 
}); 

Это discussed a little bit in the API docs по методу request.setUrl().

+0

именно то, что я искал. Спасибо, – Badr

+0

Я думаю, вы могли бы просто использовать Qs против request.query, не беспокоясь о URL-адресе - например, 'Qs.parse (request.query)' – brasskazoo

 Смежные вопросы

  • Нет связанных вопросов^_^