变量'$ _data'在使用Prisma的GraphQL变异中不能是非输入类型

时间:2018-04-29 22:31:09

标签: graphql mutation prisma

我正在使用Prisma和GraphQL,并在运行mutatioin时出错。 我成功地部署了prisma并使用本地graphQL绑定它。

- datamodel.graphql - prisma setting

type Link {
  id: ID! @unique
  description: String!
  url: String!
  postedBy: User
}

type User {
  id: ID! @unique
  name: String!
  email: String! @unique
  password: String!
  links: [Link!]!
}

- schema.graphql - 本地设置

# import Link from "./generated/prisma.graphql"
type Query {
  info: String!
  feed: [Link!]!
}

type Mutation {
  post(url: String!, description: String!): Link!
  signup(email: String!, password: String!, name: String!): AuthPayload
  login(email: String!, password: String!): AuthPayload
}

type AuthPayload {
  token: String
  user: User
}

type User {
  id: ID!
  name: String!
  email: String!
  links: [Link!]!
}

注册变异的解析器是

async function signup(parent, args, context, info) {
  // 1
  const password = await bcrypt.hash(args.password, 10)
  // 2
  const user = await context.db.mutation.createUser({
    data: { ...args, password },
  }, `{ id }`)

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

  // 4
  return {
    token,
    user,
  }
}

这是.graphqlconfig.yml内容

projects:
  app:
    schemaPath: src/schema.graphql
    extensions:
      endpoints:
        default: http://localhost:4000
  database:
    schemaPath: src/generated/prisma.graphql
    extensions:
      prisma: database/prisma.yml

我运行的GraphQL查询是。

mutation {
  signup(
    name: "Alice"
    email: "alice@graph.cool"
    password: "graphql"
  ) {
    token
    user {
      id
    }
  }
}

我运行时得到的回应是

{
  "data": {
    "signup": null
  },
  "errors": [
    {
      "message": "Variable '$_data' cannot be non input type 'UserCreateInput!'. (line 1, column 19):\nmutation ($_data: UserCreateInput!) {\n                  ^",
      "locations": [],
      "path": [
        "createUser"
      ]
    }
  ]
}

我可以找到原因。

谢谢。

3 个答案:

答案 0 :(得分:1)

通过更改为index.js中的正确端点来修复它

const server = new GraphQLServer({
   typeDefs: './src/schema.graphql',
   resolvers,
   context: req => ({
       ...req,
       db: new Prisma({
           typeDefs: 'src/generated/prisma.graphql',
           endpoint: 'http://localhost:4466/local/dev',
           secret: 'secret',
           debug: true,
       }),
   }),
})

答案 1 :(得分:0)

我认为您的pyramida.yml错误。

# The endpoint represents the HTTP endpoint for your Prisma API. It encodes
# several pieces of information:
# * Prisma server (`localhost:4466` in this example)
# * Service name (`myservice` in this example)
# * Stage (`dev` in this example)
# NOTE: When service name and stage are set to `default`, they can be omitted.
# Meaning http://myserver.com/default/default can be written as http://myserver.com.
endpoint: http://localhost:4466/myservice/dev

答案 2 :(得分:0)

尝试使用pyramida deploy --force

这对我有用。