Node.js 如何在graphql中搜索特定用户
我在nodejs和graphQL服务器中编写了这段代码。我在mongodb有2个收藏;明星和电影。明星保存有关在顶级电影中演出的明星的信息。和电影收藏保存有关每部电影的信息。当我查询电影时,这段代码会将保存在数据库中的所有电影返回给我。但是我如何修改此代码,当我通过特定id搜索明星或电影时,此代码可以返回给我单个用户或明星? 这是我的模式:Node.js 如何在graphql中搜索特定用户,node.js,graphql,Node.js,Graphql,我在nodejs和graphQL服务器中编写了这段代码。我在mongodb有2个收藏;明星和电影。明星保存有关在顶级电影中演出的明星的信息。和电影收藏保存有关每部电影的信息。当我查询电影时,这段代码会将保存在数据库中的所有电影返回给我。但是我如何修改此代码,当我通过特定id搜索明星或电影时,此代码可以返回给我单个用户或明星? 这是我的模式: const { GraphQLSchema, GraphQLObjectType, GraphQLString, G
const {
GraphQLSchema,
GraphQLObjectType,
GraphQLString,
GraphQLInt,
GraphQLNonNull,
GraphQLList,
GraphQLFloat
} = require("graphql");
const {Movie, User} = require('/home/fateme/imdb_final/db')
const starType = new GraphQLObjectType({
name: "UserType",
fields: {
name: {
type: GraphQLString,
async resolve(objId) {
const starFind = await User.findOne({ _id: objId})
return starFind.name
}
},
imdbId: {
type: GraphQLString,
async resolve(objId) {
const starFind = await User.findOne({ _id: objId})
return starFind.imdbId
}
}
}
});
const movieType = new GraphQLObjectType({
name: "MovieType",
fields: {
title: {
type: GraphQLString,
async resolve(objId) {
const movieFind = await Movie.findOne({ _id: objId._id})
return movieFind.title
}
},
year: {
type: GraphQLInt,
async resolve(objId) {
const movieFind = await Movie.findOne({ _id: objId._id})
return movieFind.year
}
},
rate: {
type: GraphQLFloat,
async resolve(objId) {
const movieFind = await Movie.findOne({ _id: objId._id})
return movieFind.rating
}
},
// rank: {
// type: GraphQLInt,
// async resolve(objId) {
// const movieFind = await Movie.findOne({ _id: objId._id})
// return movieFind.rank
// }
// },
director: {
type: starType,
async resolve(objId) {
return objId.director
// return userFind.name
}
},
stars: {
type: GraphQLList(starType),
async resolve(objId) {
return objId.stars
// return userFind.name
}
},
}
});
const queryType = new GraphQLObjectType({
name: 'Query',
fields: () => ({
users: {
type: GraphQLList(starType),
async resolve() {
const allStar = await User.find({})
return allStar._id
}
},
movies: {
type: GraphQLList(movieType),
async resolve() {
const allMovie = await Movie.find({})
return allMovie
}
},
})
});
const schema = new GraphQLSchema({
query: queryType
});
module.exports = schema;
在GraphQLJS中,您可以使用JavaScript类对象作为支持。如果这样做,就不需要为类方法提供单独的解析器;与类方法匹配的GraphQL字段将直接调用该方法并使用结果
您正在使用的GraphQL服务器库将负责解包对象列表响应到GraphQL列表类型,并根据需要从该列表向特定对象发送解析程序调用。
在任何实现语言中,GraphQL的一个好的通用模式是:
- 根级解析器(您的
和查询
类型)查找特定对象;及变异
- 对象级解析器(在您的示例中,
和UserType
)作用于已经具有编程语言级表示的已知特定对象MovieType
const root = {
users: async () => User.find({}),
movies: async () => Movie.find({})
}
只需提供一个直接反映预先存在的对象布局的模式:
const schema = buildSchema(`
type UserType {
name: String
imdbId: String
}
type MovieType {
title: String
year: Int
rating: Float
# rank: Int
director: StarType
stars: [StarType]
}
type Query {
users: [UserType]
movies: [MovieType]
}
`)
对于所显示的代码,除了尝试将rating
字段重命名为rate
之外,不需要自定义解析器。在GraphQLJS中,我认为您需要提供一个实际的对象,该对象具有您想要的实际字段名,并且我发现使用一组单独的对象直接反映您想要的GraphQLAPI通常是有意义的
根据我的经验,如果可以使用GraphQL模式语言,您应该这样做:它比相同类型的基于对象的表示更紧凑、可读性更强