diff --git a/packages/validate/index.d.ts b/packages/validate/index.d.ts index 471d000b9ec5..396cac23d83f 100644 --- a/packages/validate/index.d.ts +++ b/packages/validate/index.d.ts @@ -1,9 +1,11 @@ export * from './dist/index'; - -import { validate } from './dist/config.default'; +import * as Joi from 'joi'; declare module '@midwayjs/core/dist/interface' { interface MidwayConfig { - validate?: validate; + validate?: { + validationOptions?: Joi.ValidationOptions; + errorStatus?: number; + }; } } diff --git a/packages/validate/src/config.default.ts b/packages/validate/src/config.default.ts index 55267cccd634..dca5ff34b776 100644 --- a/packages/validate/src/config.default.ts +++ b/packages/validate/src/config.default.ts @@ -1,4 +1,4 @@ export const validate = { - allowUnknown: false, + validationOptions: {}, errorStatus: 422, }; diff --git a/packages/validate/src/configuration.ts b/packages/validate/src/configuration.ts index 9cfe214644e5..fba26e2ba1e1 100644 --- a/packages/validate/src/configuration.ts +++ b/packages/validate/src/configuration.ts @@ -35,7 +35,13 @@ export class ValidateService { const rules = getClassExtendedMetadata(RULES_KEY, ClzType); if (rules) { const schema = Joi.object(rules); - const result = schema.validate(value); + const result = schema.validate( + value, + Object.assign( + this.validateConfig.validationOptions, + options.validateOptions ?? {} + ) + ); if (result.error) { throw new MidwayValidationError( result.error.message, @@ -82,7 +88,7 @@ export class ValidateConfiguration { const result = this.validateService.validate( item, joinPoint.args[i], - options.metadata + options.metadata?.options ); if (result && result.value) { joinPoint.args[i] = result.value; diff --git a/packages/validate/src/decorator/validate.ts b/packages/validate/src/decorator/validate.ts index 8c20588bbaf7..13ac3c336d24 100644 --- a/packages/validate/src/decorator/validate.ts +++ b/packages/validate/src/decorator/validate.ts @@ -1,8 +1,10 @@ import { createCustomMethodDecorator } from '@midwayjs/decorator'; import { VALIDATE_KEY } from '../constants'; +import * as Joi from 'joi'; export interface ValidateOptions { errorStatus?: number; + validateOptions?: Joi.ValidationOptions; } export function Validate(options: ValidateOptions = {}) { diff --git a/packages/validate/test/check.test.ts b/packages/validate/test/check.test.ts index 40f0f6b7d68b..abebe1ed6349 100644 --- a/packages/validate/test/check.test.ts +++ b/packages/validate/test/check.test.ts @@ -365,4 +365,50 @@ describe('/test/check.test.ts', () => { }); expect(typeof result.value.age).toEqual('number'); }); + + it('should test global validate config', async () => { + const app = await createLightApp('', { + configurationModule: [Valid] + }); + + class UserDTO { + @Rule(RuleType.number().max(10)) + age: number; + } + + @Provide() + class Hello { + @Validate({ + validateOptions: { + allowUnknown: true, + }, + errorStatus: 400 + }) + school(data: UserDTO) { + return data; + } + } + app.getApplicationContext().bind(Hello); + const hello = await app.getApplicationContext().getAsync(Hello); + + let error; + try { + hello.school({ + age: 11 + }); + } catch (err) { + error = err; + } + + expect(error).toBeDefined(); + expect(error.status).toEqual(400); + + const result = hello.school({ + age: 1, + name: 'hello', + } as any); + expect(result['name']).toEqual('hello'); + + await close(app); + }); });