0

任何人都可以使用他们想要的任何字段查询用户,但是出于某种原因 q_id 字段解析器父类型包括所有字段。如何修复父类型并使其对每个字段都可以为空?

我只想在 q_is_public 时加载 q_id (它可以工作,但我需要记住,parant 字段可以是未定义的)。

import { extendType, inputObjectType, objectType, arg } from '@nexus/schema'

export const User = objectType({
  name: 'User',
  definition(t) {
    t.model.id()
    t.model.nickname()
    t.model.q_is_public()
    t.field('q_id', {
      type: 'Int',
      nullable: true,
      resolve: (parent) => {
        /*
        parent type is:
        {
          id: number;
          nickname: string;
          q_is_public: boolean;
        }

        parent type actual:
        {
          id?: number;
          nickname?: string;
          q_is_public?: boolean;
          q_id?: boolean;
          ... and so on, what user requested
        }
        */
        return parent?.q_is_public ? parent?.q_id : null
      },
    })
  },
})

const FindOneUserInput = inputObjectType({
  name: 'FindOneUserInput',
  definition(t) {
    t.int('id', { required: true })
  },
})

export const FindOneUser = extendType({
  type: 'Query',
  definition(t) {
    t.field('findOneUser', {
      type: 'User',
      nullable: true,
      args: { where: arg({ type: FindOneUserInput, required: true }) },
      resolve: async (_parent, { where }, { db }, _info) => {
        // here will be used pal.select instead all fields load, to load only selected fields
        const res = await db.user.findOne({
          where,
        })

        return res
      },
    })
  },
})
4

2 回答 2

1

这很正常,您的查询解析器可能正在使用 ORM 或 DB 客户端来检索所有用户数据(colmuns),包括您不需要/想要的这些数据。这就是为什么你parent的“充满了不需要的数据”。但这并不重要,重要的是您要公开哪个字段(在您的情况下id昵称q_is_public)。您的 API 之外的任何人都无法访问未公开的数据。

换句话说,您在parent参数中拥有的用户数据是由您的 DB/ORM 客户端直接提供的。而且您的 GraphQL 服务器不会全部公开(取决于您的t.model)。

您可以通过仅从您的数据库中请求idnicknameq_idq_is_public colmuns来优化您的 API 。但是,如果将来需要公开更多字段,则必须更新数据库查询以检索更多列。

于 2020-09-29T10:29:30.150 回答
0

我认为最好的选择是使用 nexus 生成的类型将类型重新定义为 Partial

resolve: (parent: DeepPartial<NexusTypesGen.NexusGenFieldTypes['User']>) => {}
于 2020-09-29T20:04:41.810 回答