Связь OneToMany работает на базе данных Prisma, но не на сервере - PullRequest
0 голосов
/ 21 марта 2019

В мутации для создания постов я использую этот код:

async function savePost(parent, args, context, info){

  let data = {...args}
  delete data.categories
  delete data.status

  if (!context.request.userId) {
    throw new Error('Please SignIn to continue.')
  }

  const post = await context.prisma.createPost({
    author: {
      connect: { id: context.request.userId }
    },
    categories: {
      set: args.categories,
    },
    status: args.status,
    ...data
  })

  return post

}

Это связывает сообщение с автором в базе данных. Я узнал об этом, используя базу данных Playground.

Однако, когда я console.log postToUpdate, он возвращает `author: null! Когда я использую gql на стороне клиента, происходит то же самое. У поста нет автора!

Хотя автор был сохранен в базе данных, я не вижу его / ее на стороне клиента и сервера.

Для справки, это Datamodel

enum Previledge {
  SUPERADMIN
  ADMIN
  MODERATOR
  AUTHOR
  READER
}

enum Category {
  TECH
  FIN
  DIGIMARK
  CODING
  TUTORIAL
  HOWTO
  WRITING
  INSPIRE
  SCIENCE
  POLITICS
  LIFESTYLE
  FOOD
  BUSINESS
  ENTREPRENEUR
  HISTORY
  HEALTH
  PET
  PARENTHOOD
  TRAVEL
  INDIA
  CHINA
  US
  UK
  WORLD
  NEWS
  REVIEW
}

enum PostStatus {
  PUBLISHED
  DRAFT
  DELETED
}

type Post {
  id: ID! @unique
  title: String!
  editorSerializedOutput: Json!
  editorCurrentContent: Json!
  editorHtml: String!
  updatedAt: DateTime!
  createdAt: DateTime!
  author: User! @relation(name: "PostsAndUser")
  categories: [Category]!
  thumbnail: Json!
  status: PostStatus!
}

type User {
  id: ID! @unique
  socialId: String! @unique
  fname: String!
  lname: String!
  name: String!
  phone: String @unique
  email: String! @unique
  gender: String
  birthday: String
  bio: String
  posts: [Post]! @relation(name: "PostsAndUser")
  profilePicture: String!
  followers: [User]!
  previledge: [Previledge]!
  signUpMethod: String!
  accessToken: String!
  updatedAt: DateTime!
  createdAt: DateTime!
}

Это вся схема:

# import * from './generated/prisma.graphql'

scalar DateTime

type Message {
  code: Int
  message: String
}

type Mutation {
  signIn(
    socialId: String!
    fname: String!
    lname: String!
    name: String!
    phone: String
    email: String!
    gender: String
    birthday: String
    bio: String
    profilePicture: String!
    signUpMethod: String!
    accessToken: String!
  ): User!
  signOut: Message
  savePost(
    title: String!
    editorSerializedOutput: Json!
    editorCurrentContent: Json!
    editorHtml: String!
    categories: [Category]!
    thumbnail: Json!
    status: PostStatus!
  ): Post!
}

type Query {
  users: [User]!
  me: User
  canUpdatePost(id: ID!): Post
}

type User {
  id: ID!
  fname: String!
  lname: String!
  name: String!
  phone: String
  email: String!
  gender: String
  birthday: String
  bio: String
  posts(where: PostWhereInput, orderBy: PostOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Post!]
  profilePicture: String!
  followers(where: UserWhereInput, orderBy: UserOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [User!]
  previledge: [Previledge]!
  signUpMethod: String!
  updatedAt: String!
  createdAt: String!
}

Ответы [ 2 ]

0 голосов
/ 22 марта 2019

Вам необходимо передать info в качестве второго параметра в createPost функцию привязки Prisma.

Есть вероятность, что поле author запрашивается у клиента в ответ на мутацию savePost, но, поскольку в createPost не передан второй параметр, prisma возвращает только скалярные поля. Поскольку поле author определено как обязательное для типа Post, проверка GraphQL завершится неудачей, если author запрашивается у клиента, но не возвращается распознавателем.

Изменить это:


const post = await context.prisma.createPost({
    author: {
      connect: { id: context.request.userId }
    },
    categories: {
      set: args.categories,
    },
    status: args.status,
    ...data
  })

до:

const post = await context.prisma.createPost({
    author: {
      connect: { id: context.request.userId }
    },
    categories: {
      set: args.categories,
    },
    status: args.status,
    ...data
  }, info)

0 голосов
/ 21 марта 2019

Насколько я знаю, если вы не укажете второй аргумент createPost, он будет возвращать только скалярные поля.Попробуйте:

  const post = await context.prisma.createPost({
    author: {
      connect: { id: context.request.userId }
    },
    categories: {
      set: args.categories,
    },
    status: args.status,
    ...data
  }, `{
   author {
     id
   }
  }`)

  console.log(post)

Кроме того, тип Post, кажется, отсутствует в вашей схеме, возможно, вам придется сгенерировать его снова.

...