错误:在解析器中定义的“用户”,但不在架构中

Flu*_*bit 5 node.js graphql apollo-server

我正在尝试为 Apollo Server 设置架构,但遇到错误。

我正在尝试的实际上是尝试使用此处找到的建议来修复一个常见且更无用的消息:

https://github.com/apollographql/apollo-server/issues/1998

我不太确定如何减少这里的代码,因为我无法更多地隔离错误。

架构.js

import { makeExecutableSchema } from 'apollo-server-express'
import ApplicationSchema from './types'
import Resolvers from './resolvers'

export default makeExecutableSchema({
  typeDefs: ApplicationSchema,
  resolvers: Resolvers
})
Run Code Online (Sandbox Code Playgroud)

解析器/index.js

import user from './user'

export default {
  user
}
Run Code Online (Sandbox Code Playgroud)

解析器/user.js

import Joi from 'joi'
import mongoose from 'mongoose'
import { UserInputError } from 'apollo-server-express'
import { signUp, signIn } from '../validators'
import { User } from '../schemata' // mongoose schema
import * as Authentication from '../authentication'

export default {
  Query: {
    me: (root, args, { request }, info) => {
      Authentication.checkSignedIn(request)

      return User.findbyId(request.session.userId)
    },

    users: (root, args, { request }, info) => {
      Authentication.checkSignedIn(request)
      User.find({})
    },

    user: (root, args, { request }, info) => {
      const { id } = args

      Authentication.checkSignedIn(request)

      if (!mongoose.Types.ObjectId.isValid(id)) {
        throw new UserInputError(`${id} is not a valid user ID.`)
      }

      return User.findById(id)
    }
  },

  Mutation: {
    signup: async (root, args, { request }, info) => {
      Authentication.checkSignedOut(request)
      await Joi.validate(args, signUp, { abortEarly: false })
      return User.create(args)
    },

    signIn: async (root, args, { request }, info) => {
      const { userId } = request.session

      if (userId) return User.findById(userId)

      await Joi.validate(args, signIn, { abortEarly: false })

      const user = await Authentication.attemptSignIn(args)

      request.session.userId = user.id

      return user
    },

    signOut: async (root, args, { request, response }, info) => {
      Authentication.checkSignedIn(request)

      return Authentication.signOut(request, response)
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

类型/index.js

import root from './root'
import user from './user'

export default [
  root, 
  user
]
Run Code Online (Sandbox Code Playgroud)

类型/根,js

import { gql } from 'apollo-server-express'

export default gql`
 type Query {
   _: String
 }

 type Mutation {
   _: String
 }

 type Subscription {
   _: String
 }
Run Code Online (Sandbox Code Playgroud)

类型/user.js

import { gql } from 'apollo-server-express'

export default gql`
  type User {
    id: ID!
    email: String!
    username: String!
    name: String!
    password: String!
    createdAt: String!
  }

  extend type Query {
    me: User
    user(id: ID!): User
    users: [User!]!
  }

  extend type Mutation {
    signUp(email: String!, username: String!, name: String!): User
    signIn(email: String!, password: String!): User
    signOut: Boolean
  }
Run Code Online (Sandbox Code Playgroud)

希望 schema.js 运行时不会出错,并且生成的可执行模式将与 Apollo Server 配合使用。

Dan*_*den 5

您的resolvers对象的结构应该像 inside 一样types/user.js,即:

{
  Query: {
    // Query fields
  },
  Mutation: {
    // Mutation fields
  },
  // etc.
}
Run Code Online (Sandbox Code Playgroud)

resolvers对象应该是类型名称的映射。相反,由于您的导入设置方式,您最终会得到:

{
  user: {
    Query: {
      // Query fields
    },
    Mutation: {
      // Mutation fields
    },
    // etc.
  }
}  
Run Code Online (Sandbox Code Playgroud)

因为这是您作为 传入的内容resolvers,Apollo 假设您正在尝试为名为 的类型映射解析器,该类型user在您的架构中不存在,因此它会抛出您看到的错误。

如果要组合多个解析器对象,则需要使用类似lodash's merge 的方法递归合并它们:

import user from './user'
import foo from './foo'
import _ from 'lodash'

export default _.merge(
  user,
  foo
)
Run Code Online (Sandbox Code Playgroud)

  • 更好地使用“graphql-tools/merge”中的“mergeResolvers”:https://www.graphql-tools.com/docs/merge-resolvers (3认同)