在 Prisma + GraphQL 中使用字符串列表作为参数的突变

Posted

技术标签:

【中文标题】在 Prisma + GraphQL 中使用字符串列表作为参数的突变【英文标题】:Mutation with list of strings as argument in Prisma + GraphQL 【发布时间】:2020-11-24 00:59:55 【问题描述】:

我正在尝试进行突变,但参数出现错误。

schema.graphql 我有以下内容:

type User 
  id: ID!
  name: String!
  email: String!
  age: Int!
  height: Float!
  weight: Float!
  goals: [String!]!
  history: [Routine!]!


type Mutation 
  signup(email: String!, password: String!, name: String!, age: Int!, height: Float!, weight: Float!, goals: [String!]!): AuthPayload

schema.prisma 中:

model User 
  id        Int      @id @default(autoincrement())
  name      String
  email     String   @unique
  password  String
  age       Int
  weight    Float
  height    Float
  goals     String[]
  history   Routine[]

那么我的变异解析器如下:

async function signup(parent, args, context, info) 
  // 1
  const password = await bcrypt.hash(args.password, 10)

  // 2
  const user = await context.prisma.user.create( data:  ...args, password  )

  // 3
  const token = jwt.sign( userId: user.id , APP_SECRET)

  // 4
  return 
    token,
    user,
  

但是当我在 GraphQL Playground 上尝试该功能时,例如:

mutation 
  signup(
    name: "Esteban"
    email: "esteban@gmail.com"
    password: "Password"
    age: 23
    height: 1.84
    weight: 70.0
    goals: ["WEIGHT_LOSS"]
  ) 
    token
    user 
      id
    
  

我收到以下错误:


  "data": 
    "signup": null
  ,
  "errors": [
    
      "message": "\nInvalid `context.prisma.user.create()` invocation in\n/Users/estebankramer1/Documents/ITBA/pf-proyf/server/src/resolvers/Mutation.js:10:42\n\n   6 // 1\n   7 const password = await bcrypt.hash(args.password, 10)\n   8 \n   9 // 2\n→ 10 const user = await context.prisma.user.create(\n       data: \n         email: 'esteban@gmail.com',\n         password: '$2a$10$hL1sMErBEcg98hpk5kRNpef2isI5d/O66zfRom8sQyThIHue7ku2O',\n         name: 'Esteban',\n         age: 23,\n         height: 1.84,\n         weight: 70,\n         goals: [\n           'WEIGHT_LOSS'\n         ]\n       \n     )\n\nUnknown arg `0` in data.goals.0 for type UserCreategoalsInput. Available args:\n\ntype UserCreategoalsInput \n  set?: List<String>\n\n\n",
      "locations": [
        
          "line": 2,
          "column": 3
        
      ],
      "path": [
        "signup"
      ]
    
  ]

我不知道自己做错了什么,也找不到带有字符串列表的 Mutations 示例。

【问题讨论】:

【参考方案1】:

事实证明我需要将突变更改为以下内容:

async function signup(parent, args, context, info) 
  // 1
  const password = await bcrypt.hash(args.password, 10)

  // 2
  const user = await context.prisma.user.create( data: 
    ...args,
      goals: 
        set: args.goals
      ,
      password
   )

  // 3
  const token = jwt.sign( userId: user.id , APP_SECRET)

  // 4
  return 
    token,
    user,
  

基本上使用集合操作。 我不知道为什么,Prisma 的文档很糟糕。也许有人可以澄清一下?

【讨论】:

感谢您指出这一点。我们一直在努力改进文档,您可以找到使用标量列表here。您也可以使用ctrl+space 来检查智能感知以查看 Prisma Client 提供的所有方法和属性。

以上是关于在 Prisma + GraphQL 中使用字符串列表作为参数的突变的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 prisma (graphql) 集群

无法通过 Prisma 在 GraphQL-yoga 中使用片段

模式拼接两个远程 Prisma/GraphQL 模式

为啥在使用 Prisma 时需要使用 GraphQL 关系?

如何在 Dockerized GraphQL + Postgres 设置中运行 Prisma 迁移?

用于解析器 GraphQL 瑜伽的 TypeScript 类型(在上下文中使用 prisma2)