十进制数的 Joi 验证无法正常工作

Joi validation for a decimal number not working properly

我正在验证 API 之一的请求正文,我正在努力将数据插入数据库。 DB 的精度为 3.

下面是架构 -

const insertDetails = {
  body: Joi.object({
    id: Joi.string().length(6).required(),
    startdate: Joi.date().format('YYYY-MM-DD').required(),
    enddate: Joi.date().format('YYYY-MM-DD').required(),
    role: Joi.number().valid(5).required(),
    fnum: Joi.number().less(1.500).precision(3).required(),
    user: Joi.string().max(8).required()
  })
}

我对 fnum 的理解是,它只允许小数精度达到 3,如果有像 1.345678[=30= 这样的数字,应该会抛出错误] 说精度应该是 3.

但是它通过并在插入数据时四舍五入到数据库中的小数点后 3 位。

我尝试在线搜索,发现我们可以验证或将转换设置为 false,但我很难仅针对此处的一个字段执行此操作,即 fnum.

Joi.validate(insertDetails, {"convert": false})

我在上面添加了行,但它抛出一个错误说

TypeError: Joi.validate is not a function

关于如何验证请求中 fnum 的精度以及如果精度更高应该抛出错误的任何建议?

像这样定义架构-

const insertSchema = Joi.object({
    id: Joi.string().length(6).required(),
    startdate: Joi.date().format('YYYY-MM-DD').required(),
    enddate: Joi.date().format('YYYY-MM-DD').required(),
    role: Joi.number().valid(5).required(),
    fnum: Joi.number().less(1.500).precision(3).required(),
    user: Joi.string().max(8).required()
  })

然后将验证函数与架构一起使用-

const {error, value} = insertSchema.validate(req.body,{"convert": false});

您可以将 req.body 对象作为第一个参数,下一个参数将是选项。

并且此函数将 return 具有 errorvalue 的对象。


或者您可以为路由创建这样的中间件-

const validateRequest = (
  req,
  next,
  schema,
  options = {
    abortEarly: false, // include all errors
    allowUnknown: true, // ignore unknown props
    stripUnknown: true, // remove unknown props
  },
) => {
  const { error, value } = schema.validate(req.body, options);
  if (error) {
    const error_ = new Error(`Validation error: ${error.details.map((x) => x.message).join(', ')}`);
    error_.statusCode = 400;
    throw error_;
  } else {
    req.body = value;
    next();
  }
};

然后使用 validateRequest 函数创建您的模式-


const insertSchema = (req, res, next) => {
  const schema = Joi.object({
      id: Joi.string().length(6).required(),
      startdate: Joi.date().format('YYYY-MM-DD').required(),
      enddate: Joi.date().format('YYYY-MM-DD').required(),
      role: Joi.number().valid(5).required(),
      fnum: Joi.number().less(1.5).precision(3).required(),
      user: Joi.string().max(8).required(),
    });
  validateRequest(req, next, schema);
};

然后在你的路由器中使用它作为中间件-

router.post('/create-post', insertSchema, (req, res, next) => {
   // Do rest of the code
});