2016-03-21 10 views
5

Ho un problema di convalida JSON passato in GET richiesta query param come stringa serializzata.Convalida stringa di query JSON come parametro di query utilizzando Joi

Quello che devo realizzare è analizzare questa stringa serializzata su JSON e convalidarla usando Joi.

Esempio: Dare è il JSON

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

E questo JSON viene convertito in una query string è:

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 

ho bisogno di qualcosa di simile a controllare:

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(), 
      } 
     } 

Is c'è qualcosa in Joi che può aiutare in questo scenario, o ho bisogno di scrivere funzioni di convalida personalizzate per questo.

risposta

3

Si desidera scambiare l'analisi della stringa di query utilizzata perché hapi non supporta tale formato per impostazione predefinita. Utilizza solo il modulo integrato nel modulo url per analizzare l'URL che non supporta le codifiche complesse delle stringhe di query. Avrai bisogno di analizzarlo manualmente usando qs, dopo di che puoi validarlo normalmente.

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'); 
}); 

Questo è discussed a little bit in the API docs con il metodo del request.setUrl().

+0

esattamente quello che stavo cercando. Grazie, – Badr

+0

Penso che potresti semplicemente usare Qs contro request.query senza preoccuparti dell'URL, ad esempio 'Qs.parse (request.query)' – brasskazoo

Problemi correlati