Javascript joi_1.default.validate不是一个函数
我想在调用控制器逻辑之前验证我的Express routes。我使用joi并创建了一个验证器,它能够根据schema对象验证请求对象Javascript joi_1.default.validate不是一个函数,javascript,node.js,typescript,express,joi,Javascript,Node.js,Typescript,Express,Joi,我想在调用控制器逻辑之前验证我的Express routes。我使用joi并创建了一个验证器,它能够根据schema对象验证请求对象 import { Request, Response, NextFunction } from 'express'; import joi, { SchemaLike, ValidationError, ValidationResult } from '@hapi/joi'; import { injectable } from 'inversify'; @in
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();
}
}
}
重要提示:我以这种方式创建SchemaLike
,因为某些路由可能有params、body、query
,需要在一次运行中进行验证
呼叫路线时
删除/users/1
验证总是失败。我得到这个错误
未处理的PromisejectionWarning:TypeError:joi_1.default.validate为
不是功能
无论调用是否正确,每次验证都会发生错误。有人知道如何修复它吗?在使用
express-joi-validation
时遇到同样的问题
如果您可以使用版本15,则降级Joi将使其成功
npm uninstall --save @hapi/joi
npm install --save @hapi/joi@15.0.3
您可以通过将
joi.validate(request,validationSchema
更改为validationSchema.validate(request
Asjoi.validate()来修复它
在v16中不再受支持。它在API文档和发行说明中有明确的文档记录。与其降级Joi
版本,不如快速查看最新版本的API并检查其正确的使用方法
是目前最新Joi API(16.1.7)的链接,您可以在其中看到使用validate
的示例
另外,为了确保您知道所使用的库的下一个版本中发生了哪些更改,最好看一下发行说明,在这里您可以看到所有更改/新功能,仅供参考,您可以看到有关验证方法的信息:
删除Joi.validate()和Joi.descripe()(改为直接调用模式)(#1941)
joi的更新版本不适用于joi.validate(请求正文、模式);
无需单独使用对象。请按以下方式使用。它对我很有效。如果我有任何错误,请告诉我:
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);
以下是一些固定的代码片段:)
安装在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....
}
我经历了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);
})
这与预期的一样,不会产生进一步的错误。像这样创建验证函数
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;
你可以通过改变它来修复它
Joi.validate(request,validationSchema)
tovalidationSchema.validate(request)
AsJoi.validate()
在v16中不再受支持
对于新版本
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);
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);
//获取架构定义上的实例
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 validate = schema.validate(req.body)
您只需检查文件中是否安装了@hapi/Joi,以及是否需要@hapi/Joi,而不是Joi.validate(req.body,schema)
为了验证,使用这种方法
const schema=Joi.object().keys({
名称:Joi.string().min(6).required(),
电子邮件:Joi.string().min(6.email(),
密码:Joi.string().min(6).required()
});
const validation=schema.validate(请求主体);
if(validation.error){
res.status(400).send(validation.error.details[0].消息);
返回;
}
用于新版本
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);
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);
下面是我正在使用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 i中joi@13.0.1.
2.安装后,请检查package.Json文件中的依赖项。很抱歉,向下投票,因为这不再实际。v15已弃用。API已更改。请检查Eran Hammer的答案,这是正确的。向下投票。您不必使用弃用的API。此答案有效。在模式中,put const schemaName=Joi.object({然后是您的普通模式数据:注意需要Joi.object。调用它时,只需使用schemaName.validate(req.body)[而不是旧版本的Joi.validate(req.body,schemaName)]虽然这段代码可以回答这个问题,但是对于未来的访问者来说,只有代码的答案是有限的有用的。在解释如何和/或为什么你的代码回答问题时,考虑编辑。这不能提供一个问题的答案。一旦你有足够的,你将能够,而不是。