Api “种类未定义”在这里是什么意思?我找不到解决这个错误的办法
我正在尝试将我的GraphQLAPI模式分解为不同的模式。 在熟悉了大量它们之后,我决定在下面使用“extend”来实现这一点 (我还想为他们使用.graphql文件扩展名,但我只有一种方法可以做到这一点——使用webpack。我并不擅长使用webpack,所以我首先尝试使用.js文件) 但是:我无法处理这个简单的任务,因为我要么有类型错误:无法读取未定义的属性“种类”,要么传递了无效的架构,或者弹出了其他内容 我在这里做错了什么?拆分和缝合模式的最佳实践/方法是什么 提前谢谢 server.jsApi “种类未定义”在这里是什么意思?我找不到解决这个错误的办法,api,graphql,backend,apollo,apollo-server,Api,Graphql,Backend,Apollo,Apollo Server,我正在尝试将我的GraphQLAPI模式分解为不同的模式。 在熟悉了大量它们之后,我决定在下面使用“extend”来实现这一点 (我还想为他们使用.graphql文件扩展名,但我只有一种方法可以做到这一点——使用webpack。我并不擅长使用webpack,所以我首先尝试使用.js文件) 但是:我无法处理这个简单的任务,因为我要么有类型错误:无法读取未定义的属性“种类”,要么传递了无效的架构,或者弹出了其他内容 我在这里做错了什么?拆分和缝合模式的最佳实践/方法是什么 提前谢谢 server.j
import express from "express";
import { ApolloServer, gql } from "apollo-server-express";
import { makeExecutableSchema } from 'graphql-tools';
import * as mongoClient from "./config";
import * as _ from 'lodash';
import { UserSchema, UserResolvers } from "./graphql.partials/user.api";
const port = process.env.PORT || 8080;
const RootSchema = gql`
type Query {
_empty: String
}
type Mutation {
_empty: String
}
`
const RootResolvers = {
};
const app = express();
const schema = makeExecutableSchema({
typeDefs: [RootSchema, UserSchema],
resolvers: _.merge(RootResolvers, UserResolvers)
});
const apolloServer = new ApolloServer({ schema });
apolloServer.applyMiddleware({ app });
app.listen({ port }, () => {
console.log(
`Server ready at http://localhost:${port}${apolloServer.graphqlPath}`
);
});
用户模式
const { gql } = require("apollo-server-express");
import User from '../models/User';
export const typeDefs = gql`
extend type Query {
users: [User]
user(id: String): User
}
extend type Mutation {
addUser(email: String, password: String): User
deleteUser(id: String!): User
updateUser(user: UserInput): User
}
type User {
id: ID!
firstName: String
lastName: String
email: String!
password: String!
confirmed: Boolean
role: String
}
input UserInput {
id: ID!
firstName: String
lastName: String
email: String
password: String
confirmed: Boolean
role: String
}
`
export const UserResolvers = {
Query: {
users: async (obj, args, context, info) => {
try {
const res = await User.find();
return res;
} catch (err) {
return err.message;
}
},
user: async (obj, args, context, info) => {
try {
const res = User.findById(args['id']);
return res;
} catch (e) {
return e.message;
}
}
},
Mutation: {
addUser: async (obj, args, context, info) => {
try {
const res = await User.create(args);
return res;
} catch (err) {
return err.message;
}
},
deleteUser: async (obj, args, context, info) => {
try {
return User.findByIdAndDelete(args['id']);
} catch (e) {
return e.message;
}
},
updateUser: async (obj, args, context, info) => {
try {
return User.findByIdAndUpdate(args.user.id, args.user)
} catch (e) {
return e.message;
}
}
}
}
文件中没有名为
UserSchema
的导出。您有两个命名的导出--UserResolvers
和typeDefs
。因此,当您尝试导入UserSchema
时,其值未定义。非常感谢!我检查了很多次,重新排列了代码,并用不同的方法进行了处理。。。你帮了我很多,两个与你的问题无关的提示。第一,您可以使用而不是graphql标记的加载程序来导入.graphql
文件。第二,你可以有一个没有字段的“空”类型,只要你扩展它。因此,您不必添加一个伪\u empty
字段,只需执行类型查询
,而不必使用花括号。@DanielRearden,Babel是否支持“扩展”,因为现在我正在尝试从graphql导入模式加载器importSchema,但它不支持它。它只能导入完全不同的模式,而不需要任何扩展。它只是将字符串解析为DocumentNodes,类型扩展是标准的GraphQL语法。