在 Hapi 中使用 Mongoose 数据库模块

在现代的 Web 开发中,数据库扮演了一个至关重要的角色。与此同时,遵循正确的设计原则和 ORM 工具选择也非常重要。Mongoose 是 Node.js 中最受欢迎的 MongoDB ORM 库之一,提供了简单易用的 API 和优秀的设计,以帮助开发人员轻松地与 MongoDB 进行交互。

在本文中,我们将深入探讨如何使用 Mongoose 数据库模块来开发基于 Hapi 的 Web 应用程序。我们将从创建一个简单的 Hapi 应用开始,然后介绍如何使用 Mongoose 模块从 MongoDB 中检索数据、向 MongoDB 中插入数据并执行其他一些 CRUD 操作。

准备工作

在开始本文之前,确保您已经具备以下技能:

  • 基本的 Node.js 知识
  • 对 Hapi Web 框架的熟悉
  • 熟悉 MongoDB 数据库
  • 了解 Mongoose 数据库模块的基础知识

如果您对这些技能不熟悉,我们建议您阅读相关的教程和文档,以便更好地理解本文内容。

首先,我们需要创建一个 Hapi 应用程序。我们可以使用 Hapi CLI 工具来创建一个基本的 Hapi 应用程序。您可以在终端中运行以下命令:

$ npm install -g @hapi/cli
$ hapi new-app hapi-mongoose-example

这将在您的当前目录中创建一个名为hapi-mongoose-example的新目录。进入该目录,然后安装所需的依赖项:

$ cd hapi-mongoose-example
$ npm install hapi@20.1.2 mongoose@5.11.8

创建一个简单的 Hapi 应用程序

接下来,我们将创建一个简单的 Hapi 应用程序,用于检查我们的 Mongoose 连接是否正确。我们将使用 Hapi 的插件机制来管理路由和插件。以下是我们将在应用程序中使用的插件列表:

  • @hapi/vision:视图引擎插件
  • @hapi/inert:静态文件插件

我们将在应用程序中使用 pug 作为我们的视图引擎。因此,我们还需要安装以下依赖项:

$ npm install pug

接下来,我们将在lib/server.js文件中编写我们的服务器代码:

'use strict';

const Hapi = require('@hapi/hapi');
const Inert = require('@hapi/inert');
const Vision = require('@hapi/vision');
const Pug = require('pug');

const init = async () => {
  const server = Hapi.server({
    port: 3000,
    host: 'localhost',
  });

  await server.register([Inert, Vision]);

  server.views({
    engines: { pug: Pug },
    relativeTo: __dirname,
    path: 'views',
  });

  server.route({
    method: 'GET',
    path: '/',
    handler: () => {
      return { message: 'Welcome to Hapi!' };
    },
  });

  await server.start();
  console.log('Server running on %s', server.info.uri);
};

process.on('unhandledRejection', (err) => {
  console.log(err);
  process.exit(1);
});

init();

在上面的代码中,我们首先配置了我们的 Hapi 服务器,然后注册了一些插件。我们还设置了视图引擎和视图的位置。最后,我们定义了一个基本的路由,该路由将在您访问主页时返回一个欢迎消息。

执行以下命令以启动服务器:

$ node lib/server.js

现在,在您的浏览器中访问http://localhost:3000,您应该能够看到一个欢迎消息。

连接到 MongoDB

接下来,我们将使用 Mongoose 数据库模块来连接到我们的 MongoDB 数据库。我们将从安装依赖项开始:

$ npm install mongoose

接下来,我们将在我们的server.js文件中添加以下代码:

const Mongoose = require('mongoose');

const init = async () => {
  const dbURI = 'mongodb://localhost/hapi-mongoose-example';

  await Mongoose.connect(dbURI, {
    useUnifiedTopology: true,
    useNewUrlParser: true,
    useCreateIndex: true,
  });

  console.log('Connected to MongoDB');
};

在上面的代码中,我们首先导入 Mongoose 模块,然后定义数据库连接 URI。我们使用Mongoose.connect()方法连接到 MongoDB。该方法将返回一个 Promise,因此我们使用await保证连接成功后再执行后续操作。

创建 Mongoose 模型

接下来,我们将创建一个简单的 Mongoose 模型。我们的模型将表示书籍实体,其中每个书籍都有一个标题和作者。

首先,我们需要在models/book.js文件中创建模型。以下是最简单的模型定义:

const Mongoose = require('mongoose');

const bookSchema = new Mongoose.Schema({
  title: { type: String },
  author: { type: String },
});

module.exports = Mongoose.model('book', bookSchema);

在上面的代码中,我们首先导入 Mongoose 模块,然后创建书籍的模式。我们注入书籍名称和作者,然后将其作为模型导出。

检索和插入数据

现在,我们已经成功地通过 Mongoose 连接到了 MongoDB,并创建了一个简单的模型。接下来,我们将使用该模型执行一些 CRUD 操作。

首先,我们将在server.js文件中创建一个路由,该路由将使用我们的模型来检索所有书籍。以下是对该路由的代码描述:

const Book = require('./models/book');

server.route({
  method: 'GET',
  path: '/books',
  handler: async () => {
    const books = await Book.find().exec();

    return { books };
  },
});

在上面的代码中,我们首先导入我们的书籍模型,然后定义了一个路由,该路由将请求从 MongoDB 中检索所有书籍。我们使用Book.find()方法来执行“查找”操作,并使用await关键字确保返回了所有书籍。

接下来,我们将在server.js中创建一个路由,该路由将使用我们的模型向 MongoDB 中插入新书籍。以下是对该路由的代码描述:

server.route({
  method: 'POST',
  path: '/books',
  handler: async (request, h) => {
    const { title, author } = request.payload;
    const book = new Book({ title, author });
    await book.save();

    return h.response({ book }).code(201);
  },
});

在上述代码中,我们定义了一个路由,用于向 MongoDB 中插入新书籍。我们从请求正文中提取书籍标题和作者,然后使用这些值创建我们的书籍对象。最后,我们使用book.save()方法将书籍保存到数据库中。

完整代码示例

接下来,我们将在server.js文件中添加我们的完整代码示例:

'use strict';

const Hapi = require('@hapi/hapi');
const Inert = require('@hapi/inert');
const Vision = require('@hapi/vision');
const Pug = require('pug');
const Mongoose = require('mongoose');
const Book = require('./models/book');

const init = async () => {
  const dbURI = 'mongodb://localhost/hapi-mongoose-example';

  await Mongoose.connect(dbURI, {
    useUnifiedTopology: true,
    useNewUrlParser: true,
    useCreateIndex: true,
  });

  console.log('Connected to MongoDB');

  const server = Hapi.server({
    port: 3000,
    host: 'localhost',
  });

  await server.register([Inert, Vision]);

  server.views({
    engines: { pug: Pug },
    relativeTo: __dirname,
    path: 'views',
  });

  server.route({
    method: 'GET',
    path: '/',
    handler: () => {
      return { message: 'Welcome to Hapi!' };
    },
  });

  server.route({
    method: 'GET',
    path: '/books',
    handler: async () => {
      const books = await Book.find().exec();

      return { books };
    },
  });

  server.route({
    method: 'POST',
    path: '/books',
    handler: async (request, h) => {
      const { title, author } = request.payload;
      const book = new Book({ title, author });
      await book.save();

      return h.response({ book }).code(201);
    },
  });

  await server.start();
  console.log('Server running on %s', server.info.uri);
};

process.on('unhandledRejection', (err) => {
  console.log(err);
  process.exit(1);
});

init();

在上面的代码中,我们首先导入所需的模块和插件,然后使用 Mongoose 连接到 MongoDB。之后,我们设置服务器和注册插件。最后,我们定义了我们的路由和处理程序。

总结

在本文中,我们深入探讨了如何在 Hapi 中使用 Mongoose 数据库模块来访问 MongoDB 数据库。我们创建了一个简单的 Hapi 应用程序,并使用 Mongoose 模块检索、插入和更新数据。如果您遵循了本文中的步骤并在应用程序中使用 Mongoose,那么您可以轻松地使用 MongoDB 数据库,并创建可重用的、易于设计和优化的数据模型。

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