【问题标题】:Validate REST parameters using Joi in Nodejs在 Nodejs 中使用 Joi 验证 REST 参数
【发布时间】:2015-09-25 16:38:50
【问题描述】:

我正在尝试使用 joi 包在 Hapi 节点服务器中验证我的 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();

【问题讨论】:

    标签: node.js rest hapijs joi


    【解决方案1】:

    您可以为此使用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 });
            }
        }
    },
    

    【讨论】:

    • 谢谢!它完美地工作。是否可以修改错误信息?
    • 是的,但同样,这应该是一个单独的问题。有很多方法可以修改错误消息。答案取决于您要修改的确切内容。只有一个键的错误消息?或者您想修改所有验证消息的输出?你想改变文字吗?还是只是结构?
    • 我要修改结构,只发送文本
    【解决方案2】:

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

    joi.string().required()

    【讨论】:

    • 我以前看过,但没用。我以这种方式使用它 Joi.any().required().string() 和 Joi.string().any().required() 并且错误指向任何未定义的内容。我是不是用错了?
    • 是的,any() 只是意味着您可以申请任何类型。你只需要joi.string().required(),就像我在上面输入的那样。
    • 这将使所有参数成为必需。我希望其中至少有一个在场
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-25
      • 2020-01-19
      • 2019-12-01
      • 1970-01-01
      • 2016-05-08
      • 2020-09-05
      • 2015-10-17
      • 2021-02-05
      相关资源
      最近更新 更多