Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript joi_1.default.validate不是一个函数_Javascript_Node.js_Typescript_Express_Joi - Fatal编程技术网

Javascript joi_1.default.validate不是一个函数

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

我想在调用控制器逻辑之前验证我的Express routes。我使用joi并创建了一个验证器,它能够根据schema对象验证请求对象

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
As
joi.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)
to
validationSchema.validate(request)
As
Joi.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)]虽然这段代码可以回答这个问题,但是对于未来的访问者来说,只有代码的答案是有限的有用的。在解释如何和/或为什么你的代码回答问题时,考虑编辑。这不能提供一个问题的答案。一旦你有足够的,你将能够,而不是。