Node.js/Hapijs - 验证 JSON 对象负载中的所有键和值而不命名键

Node.js/Hapijs - Validate all keys and values in JSON object payload without naming keys

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

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

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

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

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

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

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

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

仅允许名为 a-z 的键的 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