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

まず、検証しているフィールドにタイプミスがあります-「from」ではなく「form」です。

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 に答える