3

我想知道是否可以使用 Joi 自动清理查询参数而不是手动执行此操作?

这就是我为路线所做的。

var querystring = require('querystring');

function dateToString(date) {
  return moment(new Date(querystring.unescape(date))).toISOString();
}

function posts(request, reply) {
  request.query.from = dateToString(request.query.from);
}

这就是 Joi 模式。

var topPostsConfig = {
  description: 'Top posts',
  plugins: {
    'hapi-swagger': {
        order: 1
    }
  },
  validate: {
    query: {
       form: Joi.date().iso().optional().default(moment().subtract(2, 'day').utc().format()).description('start date for query')
    }
  }
}

{
  method: 'GET',
  path: '/posts',
  handler: posts,
  config: topPostsConfig
}

只是想知道 Joi 是否有任何特殊方法可以将查询参数自动清理为非转义字符?

编辑: 请求进来时2016-02-05T20%3A26%3A34.916Z被浏览器转义。我在想如果 Joi 可以自动取消转义,那么我不必手动进行。

4

1 回答 1

1

首先,您正在验证的字段上有一个错字 - “表单”而不是“来自”。

Joi 应该会收到解码后的 URL 查询。通过用函数替换 JOI 查询验证对象并检查值很容易检查:

server.route({
  method: 'GET',
  path: '/posts',
  handler: (req, reply) => {
    reply(req.query);
  },
  config: {
    description: 'Top posts',
    validate: {
      query: (value, options, next) => {
        console.log(value);
        next(null, value);
      },
    },
  },
});

当您修复示例中的错字时,它会按预期工作。

如果你想做一些额外的数据处理,你总是可以使用验证的函数形式并使用函数体中的 Joi.validate() 。

于 2016-03-03T01:32:31.963 回答