在现代的 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