gpt4 book ai didi

javascript - 从头开始在 NodeJs 中编写 JSON 验证

转载 作者:行者123 更新时间:2023-12-02 16:49:42 25 4
gpt4 key购买 nike

我使用 Joi 验证已经有一段时间了,在大多数情况下它都非常可靠,但每次我需要做一些自定义的事情时都需要做更多的工作。作为一个学习实验,我一直在考虑编写自己的轻量级 JSON 验证“样板文件”。

field :

  • 此验证仅限服务器(NodeJs),这意味着我可以使用现代 JavaScript 函数/方法。
  • 我使用的是 JSON 正文解析器,因此我知道 POST 数据是有效的 JSON,这意味着我不必关心某些值,例如 NaN och undefined。

让我们考虑一下来自 POST 的一小段 JSON:

{
"name": "Anders",
"dur": 3600000,
"staff": [
"Eric",
"John",
],
"unwantedProp": "foo"
}

我想要

  • 确保存在以下属性:namedurstaff。忽略所有其他。
  • 确保名称是字符串。
  • 确保 dur 是数字。 (或者如果是字符串则转换)。
  • 确保 staff 是数组,并且仅包含字符串。
  • 出现问题时直接创建错误请求错误。

首先,我编写了这段代码并将其放入模块中。

var error = function (message, status) {
var e = new Error(message);
e.status = status;
return e;
};

module.exports.validateClient = function(json, callback) {

var result = {};

if (!json.hasOwnProperty('name')) {
return callback(error('name is not defined', 400));
} else if (typeof json.name === 'string') {
result.name = json.name
} else {
return callback(error('name must be a string', 400));
}


if (!json.hasOwnProperty('dur')) {
return callback(error('dur is not defined', 400));
} else if (typeof json.dur === 'number') {
result.dur = Math.floor( json.dur )
} else if (typeof json.dur === 'string') {
result.dur = parseInt(json.dur, 10);
} else {
return callback(error('dur must be a number', 400));
}

if (!json.hasOwnProperty('staff')) {
return callback(error('staff is not defined', 400));
} else if (Array.isArray(json.staff)) {
var valid = true
json.staff.forEach(function (elem) {
if (typeof elem !== 'string') {
valid = false;
}
})
if (valid) {
result.staff = json.staff;
} else {
return callback(error('staff may only contain strings', 400));
}
} else {
return callback(error('staff must be an array', 400));
}

callback(null, result);
};

然后我使用这个函数,例如:

hlpr.validateClient(req.body, function(err, result) {
if (err) return next(err);
res.json(result);
})

尽管这有效,但我知道这是一团困惑的 if 语句......而且它完全不可重用。这让我想到了我有点模糊的问题。有人可以给我一些指导,告诉我如何将这个困惑分解为更小的可重用函数,这些函数可以应用于其他 JSON 数据...也许可以帮助我举一个 if-语句困惑的模块化部分的示例。

最佳答案

您应该使用某种模式来验证您的内容。

执行此操作的一种非常灵活的方法是允许对某些属性使用自定义验证函数。

这是一个例子:

var source ={
"name": "Anders",
"dur": 3600000,
"staff": [
"Eric",
"John",
],
"unwantedProp": "foo"
}

var schema = {
"name": function(name){return typeof name ==="string"&&name.length<10},
"dur": "number",
"staff": ["string"],
}

function validate(source, schema, result){
result = result||{}
var error
Object.keys(schema).forEach(function(key){
var val = source[key]
var type = schema[key]
if(type === "string"){
if(typeof val ==="string"){
result[key] = val
}else{
error = {success:false, message:val+" is not a string."}
}
}else if(type === "number"){
if(typeof val ==="number"){
result[key] = val
}else if (!isNaN(parseInt(val))){
result[key] = parseInt(val)
}else{
error = {success:false, message:val+" is not a number."}
}
}else if (type.constructor === Array){
if(val.constructor === Array){
var arr_type = type[0]
var valid = true
val.forEach(function(mem){
if(typeof mem !==arr_type){valid = false}
})
if(valid){
result[key] = val
}else{
error = {success:false, message:val+" is not a "+ arr_type+" array."}
}
}else{
error = {success:false, message:val+" is not an array."}
}
}else if (typeof type === "function"){
if(type(val)){
result[key] = val
}else{
error = {success:false, message:"Custom validation "+type+ " returned false for "+val+"."}
}
}
})
return error||{sucess:true, result:result}
}

关于javascript - 从头开始在 NodeJs 中编写 JSON 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26785798/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com