同时利用 GraphQL 和 Mongoose

con*_*nor 1 mongoose mongodb node.js graphql graphql-js

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

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

考虑这个模式:

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

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

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

目前,我们正在使用 GraphQL-Tools 来创建 typeDefs、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});
Run Code Online (Sandbox Code Playgroud)

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

const allFoos = async (root, data) => {
  return await Foo.find({});
};
Run Code Online (Sandbox Code Playgroud)

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

那么是否有可能让这两个概念一起发挥作用呢?两者同时使用是否有意义?

Pan*_*tav 5

正如他们所描述的 GraphQL:

GraphQL 是 API 的查询语言,也是使用您为数据定义的类型系统执行查询的服务器端运行时。GraphQL 不依赖于任何特定的数据库或存储引擎,而是由现有代码和数据支持。

猫鼬在哪里

编写 MongoDB 验证、转换和业务逻辑样板是一件很麻烦的事。这就是我们写 Mongoose 的原因

Monogoose 使用 mongodb 验证,而 graphql 是 API 的查询语言。

您可以从此处阅读有关使用 Node、Express 和 Mongoose 设置简单 GraphQL 服务器的基本示例。

这两者是完全不同的。Mongoose 在您对数据库执行任何操作时工作,而 grpgl 在您调用 API 时出现。Graphql 验证您的 API 输入参数和返回参数。如果您将这两个添加到单个应用程序中。效果会很好。

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