Nestjs + postgresql +dto store jsonb 给出的必须是json字符串错误

问题描述 投票:0回答:2

目前正在将

nestjs
设置为
postgresql
作为数据库。 我知道
postgresql
列可以存储
json
,所以我尝试使用它,但我不断收到错误

{
    "message": [
        "content must be a json string"
    ],
    "error": "Bad Request",
    "statusCode": 400
}

我想知道我的设置出了什么问题。

我的实体包括此栏

  @Column('jsonb', { nullable: false, default: {} })
  content: IContent;

在我的 CreateUpdateDTO 中,我有以下内容。

  @IsJSON()
  content: IContent;

IContent 只是一个界面

export interface IContent {
  messages: string [];
  detail: string;
}

然后在邮递员中我将其作为原始 json 正文

{
  "content": {
     "messages": ["testing", "testing", "123"],
     "detail": "some detail"
  }
}

然后我会得到

"content must be a json string"

的错误

想知道我哪里设置错误或遗漏了什么?

提前非常感谢您的任何建议和建议。

javascript postgresql nestjs dto nestjs-typeorm
2个回答
0
投票

根据文档:

@IsJSON() 检查字符串是否是有效的 JSON。

但是

{
  "messages": ["testing", "testing", "123"],
  "detail": "some detail"
}

显然不是

string
,因此验证失败是预料之中的。请参阅JSON 对象文字
在这里您可以找到如何使用@IsJSON()

的示例

但是认为在您的用例中您不需要装饰器,您的 JSON 有效负载应该被接受而没有任何问题,并且内容属性将自动转换为 JSON 并存储在 jsonb 列中。


0
投票

您可以为 Json 添加自定义验证器:

import { registerDecorator, ValidationOptions } from 'class-validator';

export function IsJsonObject(validationOptions?: ValidationOptions) {
  return function (object: NonNullable<unknown>, propertyName: string) {
    registerDecorator({
      name: 'isJsonObject',
      target: object.constructor,
      propertyName: propertyName,
      constraints: [],
      options: validationOptions,
      validator: {
        validate(value: any) {
          if (typeof value === 'string') {
            try {
              const parsed = JSON.parse(value);
              // Ensure the parsed value is an object and not an array or null
              return parsed !== null && typeof parsed === 'object' && !Array.isArray(parsed);
            } catch (e) {
              return false;
            }
          } else if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
            // Directly validate objects (but not arrays or null)
            return true;
          }
          return false;
        },
      },
    });
  };
}

并这样称呼它:

  @AutoMap()
  @IsOptional()
  @Field(() => GraphQLJSONObject, { nullable: true })
  @IsJsonObject({
    message: 'metadata must be a valid JSON object or string',
  })
  metadata?: Record<string, any>;
© www.soinside.com 2019 - 2024. All rights reserved.