javascript - joi_1.default.validate 不是函数

标签 javascript node.js typescript express joi

我想在调用 Controller 逻辑之前验证我的 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 需要在其中进行验证运行。

调用路由时

DELETE /users/1

验证总是失败。我得到这个错误

UnhandledPromiseRejectionWarning: TypeError: joi_1.default.validate is not a function

每次验证都会出现错误,无论调用是否正确。有人知道如何解决吗?

最佳答案

您可以通过更改来修复它:

joi.validate(request, validationSchema)

到:

validationSchema.validate(request)

joi.validate() 在 v16 中不再受支持。 API 文档和发行说明中对此进行了明确记录。

关于javascript - joi_1.default.validate 不是函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57956609/

相关文章:

javascript - Stripe 付款分为分期付款

javascript - 除了从 jquery 中的选择器中查找元素,我可以反过来做吗?

node.js - 将 Firebase CLI 更新到 8.4.0 会出现关于 "Unsupported engine"的错误,说 '{" Node “:">=10"}”

angular - 类型 '{}' 不可分配给类型 '{ title: string; text: string; }'

Typescript Firebase 定义文件,Promises

javascript - Angular 选择默认选项

javascript - Cordova iOS 相机插件返回空 snapshop

node.js - 当将 Consumer.on('message,callback) 放入另一个回调中时,无法从头开始消费消息

node.js - Node.js 错误 EADDRINUSE

typescript :传播类型只能从对象类型创建