[英]joi_1.default.validate is not a function
我想在調用控制器邏輯之前驗證我的 Express 路由。 我使用 joi 並創建了一個驗證器,它能夠根據架構對象驗證請求對象
import { Request, Response, NextFunction } from 'express';
import joi, { SchemaLike, ValidationError, ValidationResult } from '@hapi/joi';
import { injectable } from 'inversify';
@injectable()
export abstract class RequestValidator {
protected validateRequest = (validationSchema: SchemaLike, request: Request, response: Response, next: NextFunction): void => {
const validationResult: ValidationResult<Request> = joi.validate(request, validationSchema, {
abortEarly: false
});
const { error }: { error: ValidationError } = validationResult;
if (error) {
response.status(400).json({
message: 'The request validation failed.',
details: error.details
});
} else {
next();
}
}
}
接下來我創建了一個派生類,它創建了validationSchema 並調用了validateRequest
方法。 為簡單起見,我將展示“deleteUserById”驗證
import { Request, Response, NextFunction } from 'express';
import joi, { SchemaLike } from '@hapi/joi';
import { injectable } from 'inversify';
import { RequestValidator } from './RequestValidator';
@injectable()
export class UserRequestValidator extends RequestValidator {
public deleteUserByIdValidation = async (request: Request, response: Response, next: NextFunction): Promise<void> => {
const validationSchema: SchemaLike = joi.object().keys({
params: joi.object().keys({
id: joi.number().required(),
})
});
this.validateRequest(validationSchema, request, response, next);
}
}
重要說明:我以這種方式創建SchemaLike
,因為某些路由可能具有需要在一次運行中驗證的params, body, query
。
調用路由時
刪除 /users/1
驗證總是失敗。 我收到這個錯誤
UnhandledPromiseRejectionWarning: TypeError: joi_1.default.validate 不是函數
每次驗證都會發生錯誤,無論是否正確調用。 有人知道如何解決嗎?
您可以通過將joi.validate(request, validationSchema
更改為validationSchema.validate(request
As joi.validate()
在 v16 中不再支持來修復它。它在 API 文檔和發行說明中有明確記錄。
Joi.validate(req.body,schema);
更新版本不適用於Joi.validate(req.body,schema);
無需單獨使用對象。 如下使用。 它對我很順利。 如果我有任何錯誤,請告訴我:
const Joi = require('@hapi/joi');
const schema = Joi.object({
name:Joi.string().min(3).required(),
email:Joi.string().min(4).required().email(),
password:Joi.string().min(6).required()
});
router.post('/register', async (req,res) => {
//updated joi
// This is a shorter version
const { error } = schema.validate(req.body);
// Error in response
res.send(error.details[0].message);
// WORKING WITH DEPRECATED VERSION
// const Validation = Joi.validate(req.body,schema);
// res.send(Validation);
使用express-joi-validation
時遇到同樣的問題。
如果您可以使用版本 15,則降級 Joi 即可。
npm uninstall --save @hapi/joi
npm install --save @hapi/joi@15.0.3
我經歷過joi.validate()
也不是一個函數。 我檢查了他們的文檔並得到了修復。
const Joi = require('@hapi/joi');
const schema = Joi.object({
name:Joi.string().min(6).required(),
email:Joi.string().min(6).required().email(),
password:Joi.string().min(6).required()
});
router.post('/register', (req, res) => {
// VALIDATE BEFORE SAVING A USER
const Validation = schema.validate(req.body);
res.send(Validation);
})
這按預期工作,不會產生進一步的錯誤。
您可以通過將Joi.validate(request, validationSchema)
更改為validationSchema.validate(request)
來修復它,因為Joi.validate()
不再支持Joi.validate()
。
對於新版本
const schema = Joi.object({ name: Joi.string() .min(6) .required(),
email: Joi.string() .min(6) .required() .email(),
password: Joi.string() .min(6) .required() });
const validation = schema.validate(req.body);
與其降級Joi
版本,不如快速查看最新版本的API 並檢查正確的使用方法。
這是目前最新的 Joi API 的鏈接 (16.1.7),您可以在其中看到使用validate
的示例。
此外,為了確保您知道您使用的下一個版本的 lib 中發生了哪些更改,最好查看發行說明,這里是 Joi 16 版發行說明的鏈接,您可以在其中查看所有更改/新功能,僅供參考,您可以看到有關validate
方法的信息:
刪除 Joi.validate() 和 Joi.describe()(改為直接調用架構)(#1941)
對於新版本
const schema = Joi.object({ name: Joi.string() .min(6) .required(),
email: Joi.string() .min(6) .required() .email(),
password: Joi.string() .min(6) .required() });
const validation = schema.validate(req.body);
res.send(validation);
這里有一些固定的代碼片段:)
安裝在 npm 包下面。
npm install --save @hapi/joi@15.0.3
req-validator.js 文件
const Joi = require("@hapi/joi");
const registerValidation = data => {
const schema = {
name : Joi.string().min(4).required(),
email: Joi.string().min(4).required().email(),
password: Joi.string().min(4).required()
};
return Joi.validate(data,schema);
}
module.exports.registerValidation = registerValidation;
最后,調用控制器中的驗證方法。
const router = require("express").Router();
const {registerValidation} = require("./req-validator")
router.post("/register",async(req,res)=> {
const {error} = registerValidation(req.body);
if(error){
return res.status(400).send(error.details[0].message);
}
// logic to save in DB....
}
只需您可以檢查您的文件中是否安裝並需要@hapi/joi
並用於驗證使用此方法。
const schema= Joi.object().keys({ name: Joi.string().min(6).required(), email: Joi.string().min(6).email(), password: Joi.string().min(6).required() }); const validation = schema.validate(req.body); if(validation.error){ res.status(400).send(validation.error.details[0].message); return ; }
我想這會奏效
Following works with the latest version ("@hapi/joi": "^17.1.1"):
const Joi = require("@hapi/joi");
const schema = Joi.object({
name: Joi.string().min(6).required(),
email: Joi.string().min(6).required().email(),
password: Joi.string().min(6).required(),
});
router.post("/register", async (req, res) => {
const { error } = schema.validate(req.body);
if (error) {
res.json({ ErrorMessage: error.details[0].message });
} else {
res.json({ message: "valid data" });
}
});
像這樣創建您的驗證功能
const validateUser = function (user) {
const schema = Joi.object({
username: Joi.string().min(5).max(50),
email: Joi.string().required().email().min(5).max(255),
password: Joi.string().required().min(5).max(1024),
});
return schema.validate(user);
};
你會得到錯誤
const { error } = validateUser({ email: 'admin' });
和錯誤信息
const message = error.details[0].message;
// 獲取模式定義上的實例
function validate(model, object, scope) {
const schema = getSchema(model, scope);
return schema.validate(object);
}
// 要驗證的實際中間件工廠
module.exports = function ValidationMiddleware(model, scope) {
return (req, res, next) => {
const validationResult = validate(model, req.body, scope);
if (validationResult.error) {
throw new Error(validationResult.error.details[0].message);
} else {
next();
}
};
};
用這個
const schema = Joi.object({
name: Joi.string().min(6).required(),
email: Joi.string().min(6).email(),
password: Joi.string().min(6).required()
})
插入 const 模式 = {...}
並通過此驗證:
const validate = schema.validate(req.body)
而不是 Joi.validate(req.body,schema)
這是我正在使用 Joi 17.3.0 進行的項目的直接內容:
PDFCreatorController.exportAsPDF = (req, res) => {
const data = req.body
const schema = Joi.object().keys({
svgDataToExport: Joi.string().required()
})
const isValidPromise = new Promise((resolve) => {
const validation = schema.validate(req.body)
if (validation.error) {
res.status(422).json({
status: 'error',
message: error,
data: data
})
} else {
resolve(data)
}
})
isValidPromise.then(inputDataFromUser => {
try {
const exportAsPDF = PDFCreatorModel.exportAsPDF(inputDataFromUser)
exportAsPDF.then(data => {
res.json(data)
})
} catch (error) {
console.error(error)
return res.status(500).json(error)
}
})
}
由於JOI包的更新版本,我們都面臨此錯誤,但這是解決方案。 在 Node.js 中,當我們遇到此錯誤時,我們可以應用以下解決方案來解決它。
// Example : Here we try to validate user's data
// User's POST Api
const schema = Joi.object({
name: Joi.string().min(1).required(),
email: Joi.string().required().email(),
password: Joi.string().min(8).max(12).required(),
isEmailVerified: Joi.boolean().required(),
forgotPasswordToken: Joi.string().required(),
isDeleted: Joi.boolean().required()
});
try {
const value = await schema.validateAsync(req.body);
}
catch (err) {
return res.status(400).send(err);
}
降低joi的版本。 到 13.0.1 它將起作用。 在終端 npm 我 joi@13.0.1。 2.安裝后檢查。 包中的依賴項。 .json 文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.