前言
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
文件,在其中编写下面代码:
const express = require('express'); const { graphqlHTTP } = require('express-graphql'); const { GraphQLObjectType, GraphQLSchema } = require('graphql'); const app = express(); app.use('/graphql', graphqlHTTP({ schema: new GraphQLSchema({ query: new GraphQLObjectType({ name: 'Query', fields: { hello: { type: GraphQLString, resolve() { return 'Hello World'; }, }, }, }), }), graphiql: true, })); app.listen(3000, () => { console.log('Listening on port 3000'); });
这里我们创建了一个 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 的数据库连接:
const mongoose = require('mongoose'); const { mongodb } = require('./config'); mongoose.connect(mongodb.url, mongodb.options); const db = mongoose.connection; db.on('error', console.error.bind(console, 'MongoDB connection error:')); db.once('open', () => { console.log('MongoDB connected successfully'); }); module.exports = db;
这里使用了 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 数据模型:
const mongoose = require('mongoose'); const bookSchema = new mongoose.Schema({ name: String, author: String, publishDate: Date, }); module.exports = mongoose.model('Book', bookSchema);
这里,我们使用 mongoose.Schema()
方法来定义了一个包含字段 name
、author
和 publishDate
的数据模型,并导出了一个名为 Book
的模型对象。
接下来,我们在 index.js
文件中定义数据类型和查询:
const { GraphQLString, GraphQLList, GraphQLObjectType } = require('graphql'); const Book = require('./models/book'); const bookType = new GraphQLObjectType({ name: 'Book', fields: () => ({ name: { type: GraphQLString }, author: { type: GraphQLString }, publishDate: { type: GraphQLString }, }), }); const queryType = new GraphQLObjectType({ name: 'Query', fields: { books: { type: new GraphQLList(bookType), resolve: () => Book.find(), }, }, }); const schema = new GraphQLSchema({ query: queryType, }); app.use('/graphql', graphqlHTTP({ schema, graphiql: true, }));
这里我们定义了一个 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