簡體   English   中英

如何使用 Joi 根據計算值驗證 object?

[英]How to validate object based on computed value using Joi?

我在 wgich 中有 object 我想用一些計算值驗證它的值。 現在我正在做 javascript 的方式,但我想通過使用Joi來做到這一點。

{
    "scoreThreshold": 1,
    "questions": [
      {
        "question": "someString",
        "answer": 1,
        "factor": 2
      },
      {
        "question": "someString"
        "answer": 3
      },
      {
        "question": "someString",
        "answer": 0,
        "factor": 3
      },
      {
        "question": "someString"
        "answer": 1
      }
    ],
  }

我正在使用 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()進行自定義驗證

any.custom(method, [description])

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;
  });

堆棧閃電戰

我們可以使用Joi.ref()adjust選項以Joi方式執行此操作

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()
})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM