在 Express 应用下使用 GraphQL 配置 MongoDB

前言

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

运行以下命令启动应用:

打开浏览器访问 http://localhost:3000/graphql,可以看到 GraphQL Playground 界面,我们可以在左侧的查询面板中输入 GraphQL 查询语句,点击右侧的运行按钮来执行查询。在查询面板上方还有一个 schema 面板,可以帮助我们查看和了解数据类型和结构。

在查询面板中输入以下查询语句:

点击运行按钮,可以得到如下结果:

{
  "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() 方法来定义了一个包含字段 nameauthorpublishDate 的数据模型,并导出了一个名为 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 参数。

在查询面板中输入以下查询语句:

点击运行按钮,可以查询到所有的书籍的名字、作者和出版日期。

这里,我们成功连接了 MongoDB 数据库,使用了 GraphQL 查询语言来查询数据库中的数据。接下来,你可以根据业务需求,添加更多的数据类型和查询类型,来实现更加复杂的数据操作。

总结

本文介绍了如何在 Express 应用下使用 GraphQL 配置 MongoDB,从而实现了基于 GraphQL 和 MongoDB 的数据查询和操作。我们首先创建了一个 Express 应用,然后使用 mongoose 连接了 MongoDB 数据库,最后通过定义数据类型和查询实现了对 MongoDB 数据库的数据操作。

GraphQL 和 MongoDB 的优势相当明显,GraphQL 可以提供更加灵活和强大的查询能力,而 MongoDB 则可以提供更好的性能和可扩展性。他们在开发中的配合可以为我们带来更高的效率和更好的用户体验。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6590fb44eb4cecbf2d63699a


纠错
反馈