同时利用 GraphQL 和 Mongoose

Leveraging both GraphQL and Mongoose

是否可以同时利用 GraphQL 和 Mongoose?

到目前为止,我已经能够集成 GraphQL 和 Mongoose 来处理填充数据库,但我很难理解这如何用于检索数据,特别是具有嵌套引用的数据。

考虑这个模式:

const fooSchema = new Schema({
  name: { type: 'String', required: true },
  bar: [{
    type: mongoose.Schema.Types.ObjectId,
    ref: 'Bar',
    required: false,
  }],
});

Bar 模式本质上是相同的,只有一个字段 "name"。

是否可以 运行 GraphQL 查询使用 'bar' 中的引用填充数据?

目前,我们正在使用 GraphQL-Tools 创建我们的 typeDef、Mutations 和 Queries,看起来像这样:

const typeDefs = `
  type Foo {
    name: String!,
    bars:[Bar] 
  }
  type Bar {
    _id: ID,
    name: String,
  }

  type Query {
    allFoos: [Foo!]!
    foo(_id: ID!): Foo
  }

  type Mutation {
    ...
  }
`;
module.exports = makeExecutableSchema({typeDefs, resolvers});

最后是一个如下所示的查询指令:

const allFoos = async (root, data) => {
  return await Foo.find({});
};

我可以更改查询指令以使用 .populate() 获取 Bar,但这实际上并没有最终填充结果,我认为这是因为 typeDef 的设置方式。

那么有没有可能让这两个概念一起工作呢?两者都用有意义吗?

正如他们对 GraphQL 的描述:

GraphQL is a query language for your API, and a server-side runtime for executing queries by using a type system you define for your data. GraphQL isn't tied to any specific database or storage engine and is instead backed by your existing code and data.

猫鼬

Writing MongoDB validation, casting and business logic boilerplate is a drag. That's why we wrote Mongoose

Monogoose 使用 mongodb 验证,而 graphql 是 API.

的查询语言

您可以阅读 here 中关于使用 Node、Express 和 Mongoose 设置简单 GraphQL 服务器的基本示例。

这两个是完全不同的。当您对数据库执行任何操作时,猫鼬会工作,而当您调用 API 时,grapgl 就会出现。 Graphql 验证您的 API 输入参数和 return 参数。如果您在单个应用程序中添加这两个。它会很好用。

  1. Mongoose 将验证您的数据库操作。
  2. GraphQL 将验证您的 API 输入和输出参数。