Joi 模式中的嵌套对象
Nested object in Joi schema
我已经通过 Joi 在 AWS 值中使用嵌套对象定义了验证模式:
const schema = Joi.object({
NODE_ENV: Joi.string()
.valid('development', 'production', 'test')
.default('development'),
PORT: Joi.number().default(3000),
AWS: Joi.object({
accessKeyId: Joi.string().required(),
secretAccessKey: Joi.string().required(),
region: Joi.string().required(),
bucket: Joi.string().required(),
}).required(),
});
然后我将我的架构放入配置模块
@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true,
validationSchema: schema,
validationOptions: {
abortEarly: false,
cache: false,
},
}),
FilesModule,
UsersModule,
PostsModule,
SharedModule,
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
我在 .env
文件中添加了 AWS 变量的下一个值:
AWS={"region": "string", "accessKeyId":"string", "secretAccessKey": "string", "bucket": "string"}
但我在启动 nest 后收到下一条错误消息:
> project-8v@0.0.1 start /Volumes/MacDATA/NestJs/project-8v
> nest start
/Volumes/MacDATA/Lern/NestJs/project-8v/node_modules/@nestjs/config/dist/config.module.js:66
throw new Error(`Config validation error: ${error.message}`);
^
Error: Config validation error: "AWS" must be of type object
typeof process.env.AWS
returns a string 并且 Joi 不明白他应该解析它,也许我需要在 validationOptions 中添加一些,否则我会错过某物。我该如何解决?
从 Joi v16.0.0 开始,对象和数组字符串强制转换不再作为 built-in 选项提供。
您可以通过扩展 Joi 来复制此功能。例如:
const JoiCustom = Joi.extend({
type: 'object',
base: Joi.object(),
coerce: {
from: 'string',
method(value) {
if (value[0] !== '{' && !/^\s*{/.test(value)) {
return {
value
};
}
try {
return { value: JSON.parse(value) };
} catch (error) {
return {
errors: [error]
};
}
}
}
});
然后在您的架构中使用 JoiCustom
:
const schema = Joi.object({
...
AWS: JoiCustom.object({
...
}).required()
});
我已经通过 Joi 在 AWS 值中使用嵌套对象定义了验证模式:
const schema = Joi.object({
NODE_ENV: Joi.string()
.valid('development', 'production', 'test')
.default('development'),
PORT: Joi.number().default(3000),
AWS: Joi.object({
accessKeyId: Joi.string().required(),
secretAccessKey: Joi.string().required(),
region: Joi.string().required(),
bucket: Joi.string().required(),
}).required(),
});
然后我将我的架构放入配置模块
@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true,
validationSchema: schema,
validationOptions: {
abortEarly: false,
cache: false,
},
}),
FilesModule,
UsersModule,
PostsModule,
SharedModule,
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
我在 .env
文件中添加了 AWS 变量的下一个值:
AWS={"region": "string", "accessKeyId":"string", "secretAccessKey": "string", "bucket": "string"}
但我在启动 nest 后收到下一条错误消息:
> project-8v@0.0.1 start /Volumes/MacDATA/NestJs/project-8v
> nest start
/Volumes/MacDATA/Lern/NestJs/project-8v/node_modules/@nestjs/config/dist/config.module.js:66
throw new Error(`Config validation error: ${error.message}`);
^
Error: Config validation error: "AWS" must be of type object
typeof process.env.AWS
returns a string 并且 Joi 不明白他应该解析它,也许我需要在 validationOptions 中添加一些,否则我会错过某物。我该如何解决?
从 Joi v16.0.0 开始,对象和数组字符串强制转换不再作为 built-in 选项提供。
您可以通过扩展 Joi 来复制此功能。例如:
const JoiCustom = Joi.extend({
type: 'object',
base: Joi.object(),
coerce: {
from: 'string',
method(value) {
if (value[0] !== '{' && !/^\s*{/.test(value)) {
return {
value
};
}
try {
return { value: JSON.parse(value) };
} catch (error) {
return {
errors: [error]
};
}
}
}
});
然后在您的架构中使用 JoiCustom
:
const schema = Joi.object({
...
AWS: JoiCustom.object({
...
}).required()
});