十进制数的 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 具有 error
和 value
的对象。
或者您可以为路由创建这样的中间件-
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
});
我正在验证 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 具有 error
和 value
的对象。
或者您可以为路由创建这样的中间件-
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
});