Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用Joi基于计算值验证对象?_Javascript_Node.js_Validation_Object_Joi - Fatal编程技术网

Javascript 如何使用Joi基于计算值验证对象?

Javascript 如何使用Joi基于计算值验证对象?,javascript,node.js,validation,object,joi,Javascript,Node.js,Validation,Object,Joi,我在wgich中有一个对象,我想用一些计算值验证它的值。现在我用javascript的方式来做,但我想用javascript来做 我正在使用javascript验证它 var validator = function(doc) { var maxScore = 0 for (var item of doc.questions) { maxScore += 1000 * (item.factor == undefined ? 1: item.factor)

我在wgich中有一个对象,我想用一些计算值验证它的值。现在我用javascript的方式来做,但我想用javascript来做

我正在使用javascript验证它

var validator = function(doc) {
    var maxScore = 0
    for (var item of doc.questions) {
        maxScore += 1000 * (item.factor == undefined ? 1: item.factor)
    }

    if (maxScore == 0) {
        throw new Error("maxScore is 0")
    }

    if (doc.scoreThreshold > maxScore) {
        throw new Error("scoreThreshold more than maxScore")
    } else if ((doc.scoreThreshold / maxScore) > 0.95) {
        throw new Error("scoreThreshold too close to maxScore")
    }
}
我如何用
Joi
的方式进行此验证?

您可以使用自定义验证

any.custom(方法,[description])

我们可以使用


这不是一种快乐的方式。当我得不到任何谷歌解决方案时,我会使用any.custom。@AlokSinghMahor这个对我来说很好。不知道你所说的“Joi way”是什么意思。@MarkMcKelvy:关于Joi way,请参阅其他答案
var validator = function(doc) {
    var maxScore = 0
    for (var item of doc.questions) {
        maxScore += 1000 * (item.factor == undefined ? 1: item.factor)
    }

    if (maxScore == 0) {
        throw new Error("maxScore is 0")
    }

    if (doc.scoreThreshold > maxScore) {
        throw new Error("scoreThreshold more than maxScore")
    } else if ((doc.scoreThreshold / maxScore) > 0.95) {
        throw new Error("scoreThreshold too close to maxScore")
    }
}
var schema = Joi.object()
  .keys({
    scoreThreshold: Joi.number(),
    questions: Joi.array().items(
      Joi.object({
        question: Joi.string(),
        answer: Joi.number(),
        factor: Joi.number()
      })
    )
  })
  .custom((doc, helpers) => {
    var maxScore = 0;
    for (var item of doc.questions) {
      maxScore += 1000 * (item.factor == undefined ? 1 : item.factor);
    }

    if (maxScore == 0) {
      throw new Error("maxScore is 0");
    }

    if (doc.scoreThreshold > maxScore) {
      throw new Error("scoreThreshold more than maxScore");
    } else if (doc.scoreThreshold / maxScore > 0.95) {
      throw new Error("scoreThreshold too close to maxScore");
    }

    // Return the value unchanged
    return doc;
  });
var calculateMaxScore = function(questions) {
    return (questions || []).reduce((t, e) => t + 1000 * (e.factor == undefined ? 1: e.factor), 0)
}

var schema = Joi.object({
    "scoreThreshold": Joi.number().integer()
        .greater(0)
        .less(Joi.ref('questions', { adjust: (v) => calculateMaxScore(v) * 0.95 }))
        .required(),    
    "questions": Joi.array().items(Joi.object({
        "question": JJoi.string().min(1)).required(),
        "answer": Joi.number().integer().min(0).required(),
        "factor": Joi.number().integer().min(0)
    }))
    .required()
})