Node.js 如何在graphql中搜索特定用户

Node.js 如何在graphql中搜索特定用户,node.js,graphql,Node.js,Graphql,我在nodejs和graphQL服务器中编写了这段代码。我在mongodb有2个收藏;明星和电影。明星保存有关在顶级电影中演出的明星的信息。和电影收藏保存有关每部电影的信息。当我查询电影时,这段代码会将保存在数据库中的所有电影返回给我。但是我如何修改此代码,当我通过特定id搜索明星或电影时,此代码可以返回给我单个用户或明星? 这是我的模式: const { GraphQLSchema, GraphQLObjectType, GraphQLString, G

我在nodejs和graphQL服务器中编写了这段代码。我在mongodb有2个收藏;明星和电影。明星保存有关在顶级电影中演出的明星的信息。和电影收藏保存有关每部电影的信息。当我查询电影时,这段代码会将保存在数据库中的所有电影返回给我。但是我如何修改此代码,当我通过特定id搜索明星或电影时,此代码可以返回给我单个用户或明星?

这是我的模式:

    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
    )作用于已经具有编程语言级表示的已知特定对象

也就是说,如果您在某个特定类型的解析器函数中,则无需再次查找该对象;您应该已经拥有了它(在您的情况下,是从根查询解析器获得的)

您的解析器实现清楚地表明,您的对象已经具有与GraphQL字段名匹配的字段,因此您需要进行两项更改,以使根级解析器提供特定的对象:

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模式语言,您应该这样做:它比相同类型的基于对象的表示更紧凑、可读性更强