Prisma 游乐场中的 React + Apollo "Getting Started" 错误

React + Apollo "Getting Started" Error in Prisma Playground

我在入门 React + Apollo 章节:https://www.howtographql.com/react-apollo/1-getting-started/

当我在 Prisma Playground 中输入以下查询时(按照教程告诉我的那样):

mutation CreatePrismaLink {
  post(
    description: "Prisma gives you a powerful database toolkit "
    url: "https://prisma.io"
  ) {
    id
  }
}

mutation CreateApolloLink {
  post(
    description: "The best GraphQL client for React"
    url: "https://www.apollographql.com/docs/react/"
  ) {
    id
  }
} 

我收到这条我不明白的错误消息。好像是服务器的问题

  "errors": [
    {
      "message": "Argument id for data.postedBy.connect.id must not be null. Please use undefined instead.\n",
      "locations": [
        {
          "line": 2,
          "column": 3
        }
      ],
      "path": [
        "post"
      ],
      "extensions": {
        "code": "INTERNAL_SERVER_ERROR",
        "exception": {
          "clientVersion": "2.12.1",
          "stacktrace": [
            "Error: Argument id for data.postedBy.connect.id must not be null. Please use undefined instead.",
            "",
            "    at Document.validate (C:\Users\shanm\hackernews-react-apollo\server\node_modules\@prisma\client\runtime\index.js:77413:19)",
            "    at NewPrismaClient._executeRequest (C:\Users\shanm\hackernews-react-apollo\server\node_modules\@prisma\client\runtime\index.js:79065:17)",
            "    at C:\Users\shanm\hackernews-react-apollo\server\node_modules\@prisma\client\runtime\index.js:79002:52",
            "    at AsyncResource.runInAsyncScope (async_hooks.js:197:9)",
            "    at NewPrismaClient._request (C:\Users\shanm\hackernews-react-apollo\server\node_modules\@prisma\client\runtime\index.js:79002:25)",
            "    at Object.then (C:\Users\shanm\hackernews-react-apollo\server\node_modules\@prisma\client\runtime\index.js:79119:39)",
            "    at processTicksAndRejections (internal/process/task_queues.js:93:5)"
          ]
        }
      }
    }
  ],
  "data": null
}

请帮我找出问题所在?

那是因为服务器在编写时考虑了业务规则,即 Post 将始终属于用户。数据库在 Link table 上有一个 NOT NULL postedById 字段,即 post 将始终附加一个用户 ID。您需要在 Prisma ORM 模式的 Link 模型中使 postedById 字段可为空。要解决此问题,请对服务器端代码进行以下更改并重新启动服务器

  1. 在服务器文件夹中,转到 schema.prisma 文件,并在 postedBy 和 postedById optional/nullable 两个字段后加上后缀?

    postedBy?   User     @relation(fields: [postedById], references:[id])
    postedById? Int
    
  2. 然后运行以下命令重新创建包含更改的数据库

    npx prisma migrate reset
    
  3. 更新 Mutation.js file 中的 post 解析器函数以替换行

    postedBy: { connect: { id: userId } }
    

    postedById: userId,
    

    因为 prisma connect api 不接受空值

这是旧问题,但如果有人遇到这个问题并像我一样用谷歌搜索:

不幸的是,这里的答案对我不起作用,但解决方案已在 Node+GraphQL 教程中介绍,您可能无法自己弄清楚:

为了 post 您必须首先创建一个用户,然后被授权为该用户。创建用户的突变在页面上作为示例列出,但不幸的是,作者在尝试创建 post.[=13= 之前忘记指示 reader 到 运行 它]

  1. 将此粘贴到 playground 中以创建用户
mutation {
  signup(name: "Sarah", email: "sarah@prisma.io", password: "graphql") {
    token
    user {
      id
    }
  }
}
  1. 复制返回的token

  2. 打开左下方的“HTTP Headers”窗格

  3. 用您的令牌输入:

{
  "Authorization": "Bearer TOKEN_HERE"
}
  1. 现在您可以 运行 突变来创建 posts