#postgresql #graphql #nestjs #postgis #typeorm
Вопрос:
Я создал мутацию для вставки новых данных в postgresql под названием location. Координата столбца должна принимать и хранить данные, например, ST_GeomFromGeoJSON (‘{ «тип»: «Точка», «координаты»: [-48.23456,20.12345]}’).
Однако graphql не работает, поэтому я не знаю, где его изменить. Я думаю, это потому, что скаляр под названием GeoJSONPoint, который я создал, работает неправильно. Не могли бы вы рассказать мне, как создать скаляр, если graphql помещает данные выше?
Скаляр точки геоджсона
import { GraphQLScalarType, Kind } from 'graphql';
export const GeoJSONPoint = new GraphQLScalarType({
name: 'GeoJSONPoint',
description: 'Geometry scalar type',
parseValue(value) {
return value;
},
serialize(value) {
return value;
},
parseLiteral(ast) {
if (ast.kind === Kind.OBJECT) {
console.log(ast);
return new Object(ast);
}
return null;
}
});
местоположение.сущность
import {
Column,
CreateDateColumn,
Entity,
JoinColumn,
ManyToOne,
PrimaryGeneratedColumn
} from 'typeorm';
import { Location_Group } from './location_group.entity';
import { Geometry } from 'geojson';
import { Field, ID, Int, ObjectType } from '@nestjs/graphql';
import { GeoJSONPoint } from 'src/scalar/geoJSONPoint.scalar';
@ObjectType()
@Entity('location')
export class Location {
@Field(() => ID)
@PrimaryGeneratedColumn('increment')
id: number;
@Field(() => String)
@Column({ type: 'varchar' })
name: string;
@Field(() => GeoJSONPoint)
@Column({
type: 'geometry',
nullable: true,
spatialFeatureType: 'Point',
srid: 4326
})
coordinate: Geometry;
@Field(() => Int)
@Column({ type: 'int' })
order_number: number;
@Field()
@CreateDateColumn({ type: 'timestamptz' })
created_at: Date;
@Field(() => Location_Group)
@ManyToOne(
() => Location_Group,
(location_group) => location_group.location
)
@JoinColumn([{ name: 'location_group_id', referencedColumnName: 'id' }])
location_group: Location_Group;
}
распознаватель
@Mutation(() => Location)
async createLocation(
@Args('data') data: LocationDataInput
): Promise<Location> {
console.log(data);
return await this.locationService.setLocation(data);
}
Комментарии:
1. Я решил эту проблему. Прежде всего, мы разделили значения, введенные парселитералом в скаляре, на {тип:», координаты: []} и удалили столбец внешнего ключа. Спасибо за проявленный интерес.
2. Пожалуйста, ответьте здесь
Ответ №1:
Я решил эту проблему. Прежде всего, мы разделили значения, введенные parseLiteral
в скаляре, на
{type: '', coordinates: []}
и удалил столбец внешнего ключа.