json - 使用 Joi 验证 JSON 查询字符串作为查询参数

标签 json validation hapijs joi

我有一个验证 JSON 的问题,它作为序列化字符串在 GET 请求查询参数中传递。

我需要实现的是将此序列化字符串解析回 JSON 并使用 Joi 对其进行验证。

示例:Give 是 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 中是否有任何帮助,或者我需要为它编写自定义验证函数。

最佳答案

您需要更换使用的查询字符串解析,因为 hapi 默认不支持该格式。它只是使用 Node 内置的 url模块来解析不支持查询字符串的复杂编码的 URL。您需要使用 qs 手动解析它。 ,之后您可以正常验证。
哈比版≥18
您可以通过 server.options.query.parser 设置自定义解析器.
哈比版≤17

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 docsrequest.setUrl()方法。

关于json - 使用 Joi 验证 JSON 查询字符串作为查询参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36125736/

相关文章:

json - 使用JSON数据获取http发布请求

javascript - 这个 JSON 字符串有什么问题?使用 Rails 和 ActiveSupport 解码

java - 验证:检测到以下问题 JavaFX 项目

validation - 要求 joi 对象中至少有一个允许 null 的非 null 子项

javascript - 访问嵌套的json数组对象并确定数组长度

json - 为什么我在 Angular 2 项目中需要 `typings.json` 文件?

hapijs - NestJS 管道 Joi.validate()(不是函数)

node.js - 是什么导致了 NodeJS 中的错误 "Cannot set uncompiled validation rules without configuring a validator"?

php - Symfony 4 - 验证从 Vue 发送的表单

spring - JSR 303 验证时如何在 messages.properties 上发送参数