前言
MongoDB 是一个开源的 NoSQL 数据库,它有着良好的性能和可扩展性,因此成为了许多应用程序实现数据存储和查询的重要选择。
GraphQL 是一种用于 API 的查询语言和运行时,它可以提高开发效率和查询性能,同时提供了灵活和强大的数据查询和处理方式。
本文将介绍如何在 Express 应用下使用 GraphQL 配置 MongoDB,以及如何使用 GraphQL 和 MongoDB 实现复杂的数据查询和操作。
准备工作
在开始前,请确保你已经安装了以下软件:
- Node.js
- MongoDB
- Visual Studio Code(或其他编辑器)
创建 Express 应用
首先,我们需要创建一个 Express 应用,可以通过以下命令来初始化:
$ mkdir graphql-mongodb $ cd graphql-mongodb $ npm init -y $ npm install express graphql express-graphql mongoose
这里使用了 express、graphql、express-graphql 和 mongoose 这几个 npm 包,分别是 Express 框架、GraphQL 和 MongoDB 连接的必要组件。
初始化后,我们新建一个 index.js
文件,在其中编写下面代码:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- - ----------- - - --------------------------- ----- - ------------------ ------------- - - ------------------- ----- --- - ---------- ------------------- ------------- ------- --- --------------- ------ --- ------------------- ----- -------- ------- - ------ - ----- -------------- --------- - ------ ------ ------- -- -- -- --- --- --------- ----- ---- ---------------- -- -- - ---------------------- -- ---- ------- ---
这里我们创建了一个 Express 应用,使用 graphqlHTTP
中间件在 /graphql
路径下创建了一个 GraphQL API,其中定义了一个名为 hello
的查询字段,它返回了字符串 Hello World
。
运行以下命令启动应用:
$ node index.js
打开浏览器访问 http://localhost:3000/graphql
,可以看到 GraphQL Playground 界面,我们可以在左侧的查询面板中输入 GraphQL 查询语句,点击右侧的运行按钮来执行查询。在查询面板上方还有一个 schema 面板,可以帮助我们查看和了解数据类型和结构。
在查询面板中输入以下查询语句:
{ hello }
点击运行按钮,可以得到如下结果:
{ "data": { "hello": "Hello World" } }
这表明我们成功创建了一个 GraphQL API,并使用了一个基本的查询字段。
配置 MongoDB
接下来我们需要配置 MongoDB 数据库,用于存储数据。
首先,我们创建一个 config.js
文件,用于配置 MongoDB 的连接信息:
module.exports = { mongodb: { url: 'mongodb://localhost:27017/graphql-mongodb', options: {}, }, };
这里定义了 MongoDB 的连接 URL 和一些选项,例如数据库名称和鉴权等信息。
然后,我们新建一个 database.js
文件,来创建 MongoDB 的数据库连接:
-- -------------------- ---- ------- ----- -------- - -------------------- ----- - ------- - - -------------------- ----------------------------- ----------------- ----- -- - -------------------- -------------- --------------------------- -------- ---------- ---------- --------------- -- -- - -------------------- --------- --------------- --- -------------- - ---
这里使用了 mongoose 这个 npm 包来连接和操作 MongoDB 数据库。我们通过 mongoose.connect()
方法来连接 MongoDB 数据库,并使用 mongoose.connection
对象来监控连接成功和失败的事件。
现在,我们可以在 index.js
中引入 database.js
文件,并在应用启动的时候初始化 MongoDB 连接:
const db = require('./database');
创建 GraphQL 数据类型和查询
接下来,我们需要使用 GraphQL 定义数据类型和查询,从 MongoDB 中获取数据。
我们以一个简单的例子来说明,我们假设我们有一个名为 book
的集合,它包含了每本书的名字、作者、出版日期等信息。
在 models
目录中,我们新建一个 book.js
文件,定义一个 Book 数据模型:
-- -------------------- ---- ------- ----- -------- - -------------------- ----- ---------- - --- ----------------- ----- ------- ------- ------- ------------ ----- --- -------------- - ---------------------- ------------
这里,我们使用 mongoose.Schema()
方法来定义了一个包含字段 name
、author
和 publishDate
的数据模型,并导出了一个名为 Book
的模型对象。
接下来,我们在 index.js
文件中定义数据类型和查询:
-- -------------------- ---- ------- ----- - -------------- ------------ ----------------- - - ------------------- ----- ---- - ------------------------- ----- -------- - --- ------------------- ----- ------- ------- -- -- -- ----- - ----- ------------- -- ------- - ----- ------------- -- ------------ - ----- ------------- -- --- --- ----- --------- - --- ------------------- ----- -------- ------- - ------ - ----- --- ---------------------- -------- -- -- ------------ -- -- --- ----- ------ - --- --------------- ------ ---------- --- ------------------- ------------- ------- --------- ----- ----
这里我们定义了一个 bookType
,它定义了 Book 数据模型的字段和类型;然后我们定义了一个 queryType
,它定义了查询类型和查询语句,例如 books
查询字段,它返回了一个 Book 集合中的所有书籍;最后,我们将 queryType
定义的 Schema 对象传给了 graphqlHTTP
中间件的 schema
参数。
在查询面板中输入以下查询语句:
{ books { name author publishDate } }
点击运行按钮,可以查询到所有的书籍的名字、作者和出版日期。
这里,我们成功连接了 MongoDB 数据库,使用了 GraphQL 查询语言来查询数据库中的数据。接下来,你可以根据业务需求,添加更多的数据类型和查询类型,来实现更加复杂的数据操作。
总结
本文介绍了如何在 Express 应用下使用 GraphQL 配置 MongoDB,从而实现了基于 GraphQL 和 MongoDB 的数据查询和操作。我们首先创建了一个 Express 应用,然后使用 mongoose
连接了 MongoDB 数据库,最后通过定义数据类型和查询实现了对 MongoDB 数据库的数据操作。
GraphQL 和 MongoDB 的优势相当明显,GraphQL 可以提供更加灵活和强大的查询能力,而 MongoDB 则可以提供更好的性能和可扩展性。他们在开发中的配合可以为我们带来更高的效率和更好的用户体验。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6590fb44eb4cecbf2d63699a