连接器

配置 MongoDB

你不能一直使用数组来存储数据。更长远的来说,可能将数据存储在数据库中。在本教程中,我们将使用 MongoDB,但是像这里使用的其他技术一样,请记住,可以将其替换为其他数据存储方式。

这些在 GraphQL请求中需要用到的一些代码通常被称为 连接器

首先需要让 MongoDB 开始运行。

连接 MongoDB

现在可以在代码中实际连接到 MongoDB 并开始使用它。

这段代码做了以下事情:

  1. 首先,指定连接到所需 MongoDB 实例的 URL。这是通常可用的默认 URL,但如果不同,请随意将其替换为自己的 URL。

  2. 然后,导出连接到数据库的函数,并返回解析函数将使用的集合(现在就是 Links)。由于连接是异步操作,因此需要使用 async 关键字注标注函数。

连接器准备好后,需要将其传递给解析函数。

我们一起来看看这里的变化:

  1. 导入刚刚创建的函数。
  2. 使用异步函数将整个应用程序设置代码包起来。这里只是用到了 async/await 语法, 对于异步函数你也可用使用 promise 语法。
  3. 调用 MongoDB 连接韩素,等待连接完成。
  4. 将 MongoDB 集合放入 context 对象中。这是一个特殊的 GraphQL 对象,它被传递给所有的解析函数,因此它是它们之间共享代码(如连接器)的完美场所。
  5. 运行 start 函数。

步骤如下:

  1. graphqlExpress 函数调用中,context 对象是第三个指定的参数,每个解析函数都可以访问它。
  2. 对于 allLinks 查询,需要在 Links 集合中调用 MongoDB 的 find 函数,然后将结果转换为数组。
  3. 对于 createLink 变更,可以通过 Links.insert. 保存数据。
  4. createLink 内,仍然要使用MongoDB中的 insertedIds 来返回 Link对象。
  5. MongoDB 会自动生成 ids,这是非常好的!不过,它称之为_id,而模式称它们为 id。可以将模式更改为使用 _id,但这是讨论其他类型的解析函数的绝佳机会。 正如我们所看到的,我们可以在模式中使用任何GraphQL 类型的解析函数,它不一定只适用于 QueryMutation。在这种情况下, 我们可以在 Link 类型中创建自己的 id 字段。当服务器接收到请求时,会触发相应的解析函数,我们就可以获取 _id 而不是 id。 解析函数的第一个参数 (叫做 root) 是一个包含当前类型数据的对象。对于 QueryMutation 它应该为null,但对于其他类型,它将包含其他解析函数为其返回的任何内容。

尝试重新启动服务器,并通过 createLink 在 GraphiQL 中添加一些新的链接,然后用 allLinks 查询它们。它应该像以前一样工作,除此之外,当您再次重新启动服务器时,数据将仍然存在。

Unlock the next chapter
以下哪项是在解析函数之间共享数据/功能的最佳方法?
服务器的上下文对象
全局变量
独立的模块文件
这不可能