我正在驗證我正在處理的 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這樣的數字表示精度應該是 3 ,則應該拋出錯誤。
但它通過并在插入資料時,在資料庫中四舍五入到小數點后三位。
我嘗試在線搜索并看到我們可以驗證或將轉換設定為 false 但我很難僅針對此處的一個欄位(即fnum )執行此操作。
Joi.validate(insertDetails, {"convert": false})
我在上面添加了行,但它拋出一個錯誤說
TypeError: Joi.validate is not a function
關于如何驗證請求中 fnum 的精度的任何建議,如果精度更高,應該拋出錯誤?
uj5u.com熱心網友回復:
像這樣定義架構 -
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物件放置為第一個引數,下一個引數將是選項。
這個函式將回傳一個帶有errorand的物件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
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/347470.html
標籤:javascript 节点.js 验证 乔伊
