如何使用nexus-prisma做一个嵌套的突变解析器

时间:2019-04-24 06:58:00

标签: graphql prisma prisma-graphql nexus-prisma

我有以下数据模型:

type Job { 
    // ...
    example: String
    selections: [Selection!]
    // ...
}

type Selection { 
    ...
    question: String
    ...
}

我这样定义对象类型:

export const Job = prismaObjectType({
  name: 'Job',
  definition(t) {
    t.prismaFields([
      // ...
      'example',
      {
        name: 'selections',
      },
      // ...
    ])
  },
})

我通过这种方式来解析器:

t.field('createJob', {
  type: 'Job',
  args: {
    // ...
    example: stringArg(),
    selections: stringArg(),
    // ...
  },
  resolve: (parent, {
    example,
    selections
  }, ctx) => {
    // The resolver where I do a ctx.prisma.createJob and connect/create with example
  },
})

因此,现在在解析器中,我可以将选择内容作为json字符串接收,然后解析它并与作业连接/创建。

该突变看起来像这样:

mutation {
  createJob(
    example: "bla"
    selections: "ESCAPED JSON HERE"
  ){
    id
  }
}

我想知道是否有什么更优雅的地方可以做类似的事情:

mutation {
  createJob(
    example: "bla"
    selections: {
       question: "bla"
    }
  ){
    id
  }
}

mutation {
  createJob(
    example: "bla"
    selections(data: {
      // ...
    })
  ){
    id
  }
}

我注意到,使用nexus-prisma可以执行stringArg({list: true}),但实际上不能执行对象。

我的主要问题是,进行嵌套变异或将所有成员连接在一起的最优雅方法是什么。

1 个答案:

答案 0 :(得分:1)

您可以使用https://etasbasi.github.io/Grapher/dist/,如文档所示:

export const SomeFieldInput = inputObjectType({
  name: "SomeFieldInput",
  definition(t) {
    t.string("name", { required: true });
    t.int("priority");
  },
});

确保将类型包括在传递给types的{​​{1}}中。然后,您可以使用它来定义参数,例如

makeSchema

现在,参数值将作为常规JavaScript对象(而不是String)供您的解析器使用。如果您需要输入对象的列表,或者想使用必需的参数,则可以使用使用标量时提供的inputObjectType-args: { input: arg({ type: "SomeFieldInput", // name should match the name you provided }), } list,{ {1}},等等。

这是一个完整的例子:

nullable

然后像这样查询它:

description

或使用变量:

const Query = queryType({
  definition(t) {
    t.field('someField', {
      type: 'String',
      nullable: true,
      args: {
        input: arg({
          type: "SomeFieldInput", // name should match the name you provided
        }),
      },
      resolve: (parent, { input }) => {
        return `You entered: ${input && input.name}`
      },
    })
  },
})

const SomeFieldInput = inputObjectType({
  name: "SomeFieldInput",
  definition(t) {
    t.string("name", { required: true });
  },
});

const schema = makeSchema({
  types: {Query, SomeFieldInput},
  outputs: {
    ...
  },
});