簡體   English   中英

joi_1.default.validate 不是函數

[英]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 文件。

npm i joi

joi v17.4.x資源: https : //joi.dev/api/ ?v= 17.4.2

const schema = Joi.object({
  email: Joi.string().email().required(),
  password: Joi.string().required().min(5),
});

 const result = schema.validate(YourRequest.body);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM