簡體   English   中英

Joi 模式中的嵌套 object

[英]Nested object in Joi schema

我已經通過 Joi 在 AWS 值中使用嵌套的 object 定義了驗證模式:

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"}

但是在開始嵌套后我收到了下一條錯誤消息:

> 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返回一個字符串,Joi 不明白他應該解析它,也許我需要在validationOptions 中添加一些或者我錯過了一些東西。 我該如何解決?

從 Joi v16.0.0 開始,object 和數組字符串強制不再作為內置選項提供。

您可以通過擴展 Joi 來復制此功能。 例如:

const JoiCustom = Joi.extend([ {
    type: 'object',
    base: Joi.object(),
    coerce: {
        from: 'string',
        method(value)
        {
            if (value[0] !== '{' && !/^\s*{/.test(value))
            {
                return;
            }

            try
            {
                return { value: JSON.parse(value) };
            }
            catch (ignoreErr) {}
        }
    }
} ]);

然后在您的架構中使用JoiCustom

const schema = Joi.object({
    ...
    AWS: JoiCustom.object({
        ...
    }).required()
});

暫無
暫無

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

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