3

我的 API 中的一些功能涉及获取 POST 发送的有效负载输入并将其交给另一个应用程序进行处理。负载输入始终作为 JSON 对象发送,并且值必须始终为数字。但是,由于 JSON 对象有数百种不同的变体(因为在其他应用程序中匹配的模型越来越多),我无法为验证配置命名每个键和值我在 Hapijs 中定义的 POST 路由中的选项。

我希望我能做这样的事情,但想象一下必须有更多的hack-ish解决方法:

config: {
    validate: {
        payload: Joi.object().keys(Joi.number())    
    }
}

也许有一些方法可以遍历对象并确保值都是数字的——在 validate 选项中——但这感觉效率很低。

4

1 回答 1

7

您可以Joi.object().pattern(regex, schema);用来验证未知密钥。

如果您只想检查属性是否都是数字,您可以简单地执行以下操作:

config: {
    payload: { 
        output: data 
    },
    validate: {
        payload: Joi.object().pattern(/.*/, Joi.number()) // Any key   
    }
}

如果您还想验证密钥,可以添加更具体的正则表达式。

仅允许名为 az 的键的 Joi 示例:

var Joi = require('joi');

var object = {
    a: 1,
    b: 2,
    c1: 3  // <--- Bad key
};

var schema = Joi.object().pattern(/^[a-z]$/, Joi.number());

Joi.assert(object, schema);

输出:

Error: {
  "a": 1,
  "b": 2,
  "c1" [1]: 3
}

[1] "c1" is not allowed
于 2015-03-04T00:11:38.710 回答