1

joi パッケージを使用して、Hapi Node サーバーで GET 要求を検証しようとしています。検証は期待どおりに正しく機能しています。ただし、パラメーターが渡されない場合にエラーを返す方法を見つけるのに苦労しています。現在、渡されたパラメーターがない場合は成功します。また、送信される応答を変更する方法はありますか?

var Hapi = require('hapi');
var Joi = require('joi');

var server = module.exports = new Hapi.Server();
server.connection({
    host : process.env.HOST,
    port : 3000
});

server.route({
    method: 'GET', 
    path: '/test', 
    config: {
        validate: {
            query: {
                a: Joi.string().regex(/[0-9a-f]{8}-[0-9a-f]{4}/),
                b: Joi.string(),
                c: Joi.string(),
                d: Joi.string(),
                e: Joi.string()
            }
        }
    },
    handler: function(req, reply) {
        reply('i am a beautiful butterfly');
    }
});

server.start();
4

3 に答える 3

3

そのために使用できますobject.or()

config: {
    validate: {
        query: Joi.object().keys({
            a: Joi.string(),
            b: Joi.string(),
            c: Joi.string(),
            d: Joi.string(),
            e: Joi.string()
        }).or('a', 'b', 'c', 'd', 'e')
    }
},

クエリ パラメータが指定されていない場合は、次の応答が返されます。

{ statusCode: 400,
  error: 'Bad Request',
  message: '"value" must contain at least one of [a, b, c, d, e]',
  validation: { source: 'query', keys: [ 'value' ] } }

応答を変更するには、次のカスタム ハンドラーを使用できますfailAction()

config: {
    validate: {
        query: Joi.object().keys({
            a: Joi.string(),
            b: Joi.string(),
            c: Joi.string(),
            d: Joi.string(),
            e: Joi.string()
        }).or('a', 'b', 'c', 'd', 'e'),
        failAction: function(request, reply, source, error) {

            return reply({ message: error.output.payload.message });
        }
    }
},
于 2015-07-08T01:05:48.920 に答える
0

Joi.object().when()パラメータが存在するかどうかを使用して確認し、それに応じてオプションにするか必須にするかを決定します。

いいえ、エラーを変更することはできません。hapi でサーバー側で処理できますfailAction: {}。Joi にはカスタム エラー機能がありません。

于 2015-07-09T13:04:02.773 に答える