在 Hapi 中使用 Sequelize 进行 ORM 操作
尽管 Hapi 在 Web 开发中表现出色,但它并没有内置的 ORM 解决方案。 因此,在使用 Hapi 时,我们需要选择一个 ORM 来管理数据库操作。 Sequelize 是一个强大的 ORM 框架,它支持多种数据库,并提供了丰富的功能。 在本文中,我们将探讨如何在 Hapi 中使用 Sequelize 进行 ORM 操作。
安装
在使用 Sequelize 之前,我们需要先安装它。可以使用以下命令在 Hapi 应用程序中安装 Sequelize:
npm install sequelize npm install mysql2 // Hapi 中使用的数据库
还需要安装 Sequelize 的一些其他依赖项,包括:
npm install sequelize-cli npm install @hapi/inert npm install @hapi/vision npm install hapi-sequelizejs
配置
在使用 Sequelize 进行 ORM 操作之前,我们需要配置 Sequelize。首先,我们需要在 Hapi 应用程序中创建一个数据库连接。在更改数据库配置时,我们可以更改 Sequelize 实例的选项。以下代码显示如何配置 Sequelize:
const Sequelize = require('sequelize'); const sequelize = new Sequelize('database', 'username', 'password', { dialect: 'mysql', host: 'localhost', dialectOptions: { connectTimeout: 1000 } });
其中,database
、username
和 password
分别是您的数据库、用户名和密码。通过将 dialect
设置为 'mysql'
,我们指定了要使用的数据库类型。此外,dialectOptions
选项可以用于指定一些特定于 MySQL 的选项。
在连接到数据库后,我们将使用 Sequelize 定义数据库表。这些表定义称为 Sequelize 模型。我们可以创建一个包含所有模型的目录,并使用 Sequelize CLI 自动生成这些模型。在目标目录中,只需要运行以下命令即可:
npx sequelize-cli init --force
执行后,会生成多个目录和文件。其中 models
目录包含所有模型定义。所有的模型定义都存储在该目录下。通过运行以下命令,可以创建一个具体的模型:
npx sequelize-cli model:generate --name User --attributes name:string,email:string,password:string
该命令将在 models
目录下生成一个 User.js
文件,其包含了我们定义的所有参数以及其对应类型的值。
使用 Hapi 实现 Sequelize 查询
在我们的服务实现中,我们可以使用 sequelize
和 sequelize-cli
提供的功能来查询数据库。以下是通过 Hapi 实现查询的步骤:
const Hapi = require('@hapi/hapi'); const { Sequelize, sequelize } = require('sequelize'); const Inert = require('@hapi/inert'); const Vision = require('@hapi/vision'); const HapiSequelize = require('hapi-sequelizejs'); const server = new Hapi.Server({ host: 'localhost', port: 8080 }); const start = async () => { await server.register([ Inert, Vision, { plugin: HapiSequelize, options: [sequelize] } ]); await sequelize .authenticate() .then(() => console.log('Connection has been established successfully.')) .catch((err) => console.error('Unable to connect to the database:', err)); await server.start(); console.log(`Server running on ${server.info.uri}`); }; server.route({ method: 'GET', path: '/users/{id}', handler: async (request, h) => { const { params: { id } } = request; const User = request.getDb().getModel('User'); const user = await User.findByPk(id); return user; } }); start();
首先,使用 hapi-sequelizejs
将 Sequelize 实例传递给 Hapi。在接下来的步骤中,我们使用数据库模型进行模型操作。在处理请求时,我们使用模型查找用户并返回查询结果。
以上就是使用 Hapi 和 Sequelize 进行 ORM 操作的完整流程。虽然本文简单介绍了思路,但以下是相关示例代码以供参考。完整示例代码请点击这里计算。
const Hapi = require('@hapi/hapi'); const { Sequelize, sequelize } = require('sequelize'); const Inert = require('@hapi/inert'); const Vision = require('@hapi/vision'); const HapiSequelize = require('hapi-sequelizejs'); const server = new Hapi.Server({ host: 'localhost', port: 8080 }); const start = async () => { await server.register([ Inert, Vision, { plugin: HapiSequelize, options: [sequelize] } ]); await sequelize .authenticate() .then(() => console.log('Connection has been established successfully.')) .catch((err) => console.error('Unable to connect to the database:', err)); await server.start(); console.log(`Server running on ${server.info.uri}`); }; start(); // BEGIN Define models const User = sequelize.define('user', { firstName: { type: Sequelize.STRING }, lastName: { type: Sequelize.STRING } }); const Todo = sequelize.define('todo', { title: { type: Sequelize.STRING }, description: { type: Sequelize.STRING } }); User.hasMany(Todo); Todo.belongsTo(User, { as: 'user' }); // END Define models // BEGIN API routes server.route({ method: 'GET', path: '/users', handler: async (request, h) => { const User = request.getDb().getModel('user'); const users = await User.findAll(); return users; } }); server.route({ method: 'GET', path: '/users/{id}', handler: async (request, h) => { const { params: { id } } = request; const User = request.getDb().getModel('user'); const user = await User.findByPk(id); return user; } }); server.route({ method: 'GET', path: '/users/{id}/todos', handler: async (request, h) => { const { params: { id } } = request; const User = request.getDb().getModel('user'); const Todo = request.getDb().getModel('todo'); const user = await User.findByPk(id, { include: [{ model: Todo, as: 'todos' }] }); return user.todos; } }); server.route({ method: 'POST', path: '/users', handler: async (request, h) => { const User = request.getDb().getModel('user'); const {payload: {firstName, lastName}} = request; const user = await User.create({ firstName, lastName }); return user; } }); server.route({ method: 'POST', path: '/todos', handler: async (request, h) => { const User = request.getDb().getModel('user'); const Todo = request.getDb().getModel('todo'); const {payload: {title, description, userId}} = request; const user = await User.findByPk(userId); const todo = await Todo.create({ title, description }); await todo.setUser(user); return todo; } }); server.route({ method: 'DELETE', path: '/todos/{id}', handler: async (request, h) => { const { params: { id } } = request; const Todo = request.getDb().getModel('todo'); const todo = await Todo.findByPk(id); await todo.destroy(); return 'Todo deleted'; } }); // END API routes
总结
在 Hapi 服务中,Sequelize 可以作为 ORM 框架使用。我们只需要执行简单的配置,即可使用 Sequelize 实现数据库操作。本文讨论了如何设置 Sequelize 并使用通过它来查询数据库。我们学习了如何使用 Hapi 支持的插件,以구步骤将 Sequelize 集成到 Web 服务应用程序中,以及如何定义模型、查询数据库和返回响应到客户端。感谢您的阅读,期待您的使用。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65b9b7f9add4f0e0ff23dbfb