2016-03-21 9 views
5

GETリクエストクエリparamでシリアル化された文字列として渡される検証JSONの問題があります。Joiを使用してJSONクエリ文字列をクエリパラメータとして検証する

私が達成する必要があるのは、このシリアル化された文字列を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がデフォルトでこの形式をサポートしていないため、使用されているクエリ文字列解析をスワップアウトします。 urlモジュールで構築されたNodeを使用して、クエリ文字列の複雑なエンコーディングをサポートしていない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'); 
}); 

これはrequest.setUrl()法でdiscussed a little bit in the API docsです。

+0

私が探していたもの。ありがとう、 – Badr

+0

URLを気にせずにrequest.queryに対してQsを使うことができると思います。つまり、 'Qs.parse(request.query)' – brasskazoo

関連する問題