условный подзапрос graphql на основе родительского поля - PullRequest
1 голос
/ 30 апреля 2020

Каков подход, когда вашему подзапросу необходимо разрешить какое-либо поле от родителя?

В моем случае owner_id поле от родителя необходимо для распознавателя владельца, но что мне делать, если пользователь не будет запрашивать его? ?

Должен ли я каким-либо образом принудительно вызывать owner_id поле или пропустить выборку владельца, когда owner_id не запрашивается?

Проблематично c запрос:

 project(projectId: $projectId) {
      name
      owner_id <--- what if user didn't fetch this
      owner {
        nickname
      }
    }

Тип Graphql:

  type Project {
    id: ID!
    name: String!
    owner_id: String!
    owner: User!
  }

И преобразователи:

export const project = async (_, args, ___, info) => {
  return await getProjectById(args.projectId, getAstFields(info))
}

export default {
  async owner(parent, __, ___, info) {
    return await getUserById(parent.owner_id, getAstFields(info))
  },
}

Вспомогательные функции, которые не имеют значения:

export const getUserById = async (userId: string, fields: string[]) => {
  const [owner] = await query<any>(`SELECT ${fields.join()} FROM users WHERE id=$1;`, [userId])

  return owner
}

export const getAstFields = (info: GraphQLResolveInfo): string[] => {
  const { fields } = simplify(parse(info) as any, info.returnType) as { fields: { [key: string]: { name: string } } }

  return Object.entries(fields).map(([, v]) => v.name)
}

1 Ответ

1 голос
/ 30 апреля 2020

Вы всегда можете прочитать owner_id в распознавателе типов project.

В этом случае ... измените функцию getAstFields, чтобы она принимала дополнительный параметр, например массив всегда требуемых свойств. Таким образом, вы можете присоединить owner_id к полям, запрашиваемым в запросе (определено в info).

Я думал, что распознаватель внутренне отбросит дополнительные реквизиты.

Это будет удалено позже, из ответа.

...