Error: "user" defined in resolvers, but not in schema
Error: "user" defined in resolvers, but not in schema
我正在尝试为 Apollo Server 设置模式,但 运行 遇到错误。
我正在尝试的实际上是尝试使用此处找到的建议来修复常见且更无用的消息:
https://github.com/apollographql/apollo-server/issues/1998
我不太确定如何减少此处的代码,因为我无法找出比这更多的错误。
schema.js
import { makeExecutableSchema } from 'apollo-server-express'
import ApplicationSchema from './types'
import Resolvers from './resolvers'
export default makeExecutableSchema({
typeDefs: ApplicationSchema,
resolvers: Resolvers
})
resolvers/index.js
import user from './user'
export default {
user
}
resolvers/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)
}
}
}
types/index.js
import root from './root'
import user from './user'
export default [
root,
user
]
types/root,js
import { gql } from 'apollo-server-express'
export default gql`
type Query {
_: String
}
type Mutation {
_: String
}
type Subscription {
_: String
}
types/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
}
希望 schema.js 应该 运行 没有错误,并且生成的可执行模式将与 Apollo Server 一起正常工作。
您的 resolvers
对象的结构应该类似于 types/user.js
中的内容,即:
{
Query: {
// Query fields
},
Mutation: {
// Mutation fields
},
// etc.
}
resolvers
对象应该是类型名称的映射。相反,由于您的导入设置方式,您最终得到:
{
user: {
Query: {
// Query fields
},
Mutation: {
// Mutation fields
},
// etc.
}
}
因为这是您作为 resolvers
传递的内容,Apollo 假定您正在尝试为名为 user
的类型映射解析器,该类型在您的模式中不存在,所以它会抛出您看到的错误。
如果你想合并多个解析器对象,你需要使用类似lodash
的merge:
递归合并它们
import user from './user'
import foo from './foo'
import _ from 'lodash'
export default _.merge(
user,
foo
)
我正在尝试为 Apollo Server 设置模式,但 运行 遇到错误。
我正在尝试的实际上是尝试使用此处找到的建议来修复常见且更无用的消息:
https://github.com/apollographql/apollo-server/issues/1998
我不太确定如何减少此处的代码,因为我无法找出比这更多的错误。
schema.js
import { makeExecutableSchema } from 'apollo-server-express'
import ApplicationSchema from './types'
import Resolvers from './resolvers'
export default makeExecutableSchema({
typeDefs: ApplicationSchema,
resolvers: Resolvers
})
resolvers/index.js
import user from './user'
export default {
user
}
resolvers/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)
}
}
}
types/index.js
import root from './root'
import user from './user'
export default [
root,
user
]
types/root,js
import { gql } from 'apollo-server-express'
export default gql`
type Query {
_: String
}
type Mutation {
_: String
}
type Subscription {
_: String
}
types/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
}
希望 schema.js 应该 运行 没有错误,并且生成的可执行模式将与 Apollo Server 一起正常工作。
您的 resolvers
对象的结构应该类似于 types/user.js
中的内容,即:
{
Query: {
// Query fields
},
Mutation: {
// Mutation fields
},
// etc.
}
resolvers
对象应该是类型名称的映射。相反,由于您的导入设置方式,您最终得到:
{
user: {
Query: {
// Query fields
},
Mutation: {
// Mutation fields
},
// etc.
}
}
因为这是您作为 resolvers
传递的内容,Apollo 假定您正在尝试为名为 user
的类型映射解析器,该类型在您的模式中不存在,所以它会抛出您看到的错误。
如果你想合并多个解析器对象,你需要使用类似lodash
的merge:
import user from './user'
import foo from './foo'
import _ from 'lodash'
export default _.merge(
user,
foo
)