繁体   English   中英

是的,将最小最大日期与构建日期而不是当前日期进行比较

[英]Yup compares min max date with build date instead of current date

所以这很奇怪,我不明白它来自哪里。

我有一个注册 WS(在 Node.js 中使用 Sales.js),其中要求的最低年龄为 18 岁,验证由 Yup 完成。

这是我的 yup 架构:

 const yup = require('yup'); const moment = require('moment'); const birthdate = yup.date().typeError('INVALID_DATE').min(moment().subtract(115, 'years'), 'MIN_AGE').max(moment().endOf('day').subtract(18, 'years'), 'MAX_AGE'); module.exports = { birthdate };

正如您从下面的示例中看到的那样,当我输入今天的日期时,它将它与2002-07-31进行比较,而它应该与moment().endOf('day').subtract(18, 'years')进行比较moment().endOf('day').subtract(18, 'years')这将是2002-08-12

请注意, 2002-07-31是我构建项目的日期。 所以如果我现在重新编译它,我今天将不再有这个问题。 如果我明天重新测试,它将与今天的日期进行比较。 我不知道这怎么可能或如何解决。

这是来自yup的错误:

 "errors": [{ "field": "birthdate", "code": "E_MAX_AGE_BIRTHDATE", "params": { "path": "birthdate", "value": "2002-08-12T10:00:00.000Z", "originalValue": "2002-08-12T10:00:00.000Z", "max": "2002-07-31T21:59:59.999Z" } }]

有任何想法吗? 使用的版本: moment 2.24.0 yup 0.29.2

好的,所以我找到了解决方案。

事实上,Yup 将存储您最初提供的日期并进行编译。 每次验证日期时,它将不再执行moment().endOf('day').subtract(18, 'years')

为此,您必须使用测试方法,而不是minmax

我为yup.date创建了一个扩展方法,如下所示:

 /** * This function is used to format the error like date.min does */ function customValidationError(errorMessage, value, path, extraData) { const error = new yup.ValidationError(errorMessage, value, path); error.params = { path: path, value: value, originalValue: value, ...extraData }; return error; } /** * Extension method to yup.date * You should pass a function that will be executed each time you want to check again the current date. * @name yup.dynamicMaxDate * @global yup.dynamicMaxDate */ yup.addMethod(yup.date, 'dynamicMaxDate', function(path, errorMessage = 'MAX_DATE', maxDateFunction) { return this.test(path, errorMessage, (value) => { const maxDate = maxDateFunction(); return new Promise((resolve, reject) => { const error = customValidationError(errorMessage, value, path, { max: maxDate }); value && moment(value).isAfter(maxDate)? reject(error): resolve(true); }); }); }); /** * Extension method to yup.date to check if date is before a given date * You should pass a function that will be executed each time you want to check again the current date. * @name yup.dynamicMinDate * @global yup.dynamicMinDate */ yup.addMethod(yup.date, 'dynamicMinDate', function(path, errorMessage = 'MIN_DATE', minDateFunction) { return this.test(path, errorMessage, (value) => { const minDate = minDateFunction(); return new Promise((resolve, reject) => { const error = customValidationError(errorMessage, value, path, { min: minDate }); value && moment(value).isBefore(minDate)? reject(error): resolve(true); }); }); });

并使用这些方法:

 const birthdate = yup.date().typeError('INVALID_DATE') // Note tham I'm passing a function to be executed when validating date.dynamicMinDate('birthdate', 'MIN_AGE', () => { return moment().startOf('day').subtract(115, 'years').toDate(); }).dynamicMaxDate('birthdate', 'MAX_AGE', () => { return moment().endOf('day').subtract(18, 'years').toDate(); });

对于任何想要一种更简单的方法来获得在验证时刻(例如,不是构建日期的时间)评估的动态日期(例如现在)的人:使用 yup.lazy()。

下面的示例将检查最小日期是否晚于最大日期(反之亦然),并在每次验证尝试时新生成一个动态最大日期。

 import { date, lazy, object, ref } from 'yup' function getMinDate() { return new Date(2000, 1, 1) } function getMaxDate() { return new Date() } const schema = object({ minDate: date().min(getMinDate(), `Min start date is ${getMinDate()}`).max(ref('maxDate'), 'Min date must be earlier than the max date'), maxDate: lazy(() => date().min(ref('minDate'), 'Max date must be later than min date').max(getMaxDate(), `Max start date is ${getMaxDate()}`) ) })

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM