首页 > 解决方案 > 如何正确格式化 JOI 日期/模式?

问题描述

我有一个通过obj.pattern. 我要验证的关键是格式化的日期,它以下列格式提供给函数DD/MM/YYYY

Joi.date用来验证这个值,当日期小于每月 12 日时,这很好。如果更多,则返回错误。假设默认 JOI 格式MM/DD/YYYY显然会导致错误,因为日历年有 12 个月。这反映在控制台日志中 - 如果我将日期值更改为numberField大于 12 的任何值,那么我可以看到错误。如果它保持在下方,则不会引发错误。

我想弄清楚如何格式化此响应,以便 JOI 可以验证正确的架构。我已将问题简化并简化为我在此处分享的原型:https ://codesandbox.io/embed/naughty-booth-862wb

任何人都可以帮忙吗?

标签: javascriptjoi

解决方案


您需要使用包中的.format()方法joi-date来设置自定义日期格式。请参阅内联评论。

    import "./styles.css";
    import JoiBase from "@hapi/joi";
    import JoiDate from "@hapi/joi-date";

    const Joi = JoiBase.extend(JoiDate); // extend Joi with Joi Date

    document.getElementById("app").innerHTML = `
    <h1>Hello Vanilla!</h1>
    <div>
      We use Parcel to bundle this sandbox, you can find more info about Parcel
      <a href="https://parceljs.org" target="_blank" rel="noopener noreferrer">here</a>.
    </div>
    `;
    export const dateRequired = (keys, message) => {
      return Joi.object().pattern(
        Joi.valid(keys),
        Joi.date()
          .format("DD/MM/YYYY") // set desired date format here
          .raw()
          .error(() => "message")
      );
    };

    const state = {
      numberField: "14/09/1995" // "14/9/1995" will fail without leading "0" on 09
    };
    const schema = dateRequired(["numberField"]);

    const valid = Joi.validate(state, schema); // "valid" is a promise
    valid
      .then(res => {
        console.log("SUCCESS", res);
      })
      .catch(e => {
        console.log("ERROR", e.toString());
      });

https://codesandbox.io/embed/prod-grass-f95sz


推荐阅读