目前正在将
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"
的错误
想知道我哪里设置错误或遗漏了什么?
提前非常感谢您的任何建议和建议。
您可以为 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>;