在Nodejs中使用Joi验证REST参数

时间:2015-07-07 23:49:30

标签: node.js rest hapijs joi

我正在尝试使用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();

3 个答案:

答案 0 :(得分: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 });
        }
    }
},

答案 1 :(得分:0)

查看https://github.com/hapijs/joi#anyrequired

joi.string().required()

答案 2 :(得分:0)

使用Joi.object().when()并检查参数是否存在,并据此决定是否要将其设为可选或必需。

并且你不能修改错误。您可以在服务器端以hapi failAction: {}处理它。 Joi没有自定义错误功能。