如何使用Joi Library比较两次

问题描述

我有两个字段。我需要使用joi库应用验证, 目前,我已应用验证,它显示错误为: TypeError:joi.string(...)。required(...)。less不是函数。 验证计划开始时间应小于计划结束时间。 ! 我已经完成了以下代码

{
schema=joi.object({
  taskname:joi.string().required().label('Please enter Task Description!'),task:joi.string().invalid(' ').required().label('Please enter Task Description!'),taskn:joi.string().min(1).max(80).required().label(' Task Description too long.'),projectname:joi.string().required().label('Please select Project !'),type:joi.string().required().label('Please select Task Type !'),status:joi.string().invalid('None').required().label('Please choose Status'),plannedstarttime:joi.string().regex(/^([0-9]{2})\:([0-9]{2})$/).required().label('Please fill Planned Start Time !'),plannedendtime:joi.string().regex(/^([0-9]{2})\:([0-9]{2})$/).required().label('Please fill Planned 
   End Time !'),plantime:joi.string().required().less(joi.ref('plannedendtime')).label('Planned Start time should 
  be less than Planned End time. !'),}) 
result=schema.validate({taskname:taskname,task:taskname,taskn:taskname,type:tasktype,projectname:projectname,status:request.body.status,plannedstarttime:plannedstarttime,plannedendtime:plannedendtime,plantime:plannedstarttime});
}

我如何实现此验证。

解决方法

您需要确保您使用的是正确的类型。 string未定义less方法,因此会出现错误。

您可以删除plantime,并提供实现custom validation functionstring comparison

schema = joi.object({
  ...
  // plantime: // <-- remove it
  ...
}).custom((doc,helpers) => {
    if (doc.plannedstarttime > doc.plannedendtime) {
        throw new Error("Planned Start time should be lower than Planned End time!");
    }
    return doc; // Return the value unchanged
});

要考虑的另一种选择是使用date类型(顺便说一句,您是否还需要知道日期,而不仅仅是时间?):

schema = joi.object({
  ...
  plannedstarttime: joi.date().required() ...
  plannedendtime: joi.date().required().greater(joi.ref('plannedstarttime')) ...
  // plantime // <-- remove it
  ...
});

如果您随后想要以某种方式格式化plannedstarttimeplannedendtime,请使用format。该格式应适用于moment.js formatting。例如,仅显示小时+分钟的格式为HH:mm