如何在 Hapi 中使用 Sequelize 进行 ORM 操作

在 Hapi 中使用 Sequelize 进行 ORM 操作

尽管 Hapi 在 Web 开发中表现出色,但它并没有内置的 ORM 解决方案。 因此,在使用 Hapi 时,我们需要选择一个 ORM 来管理数据库操作。 Sequelize 是一个强大的 ORM 框架,它支持多种数据库,并提供了丰富的功能。 在本文中,我们将探讨如何在 Hapi 中使用 Sequelize 进行 ORM 操作。

安装

在使用 Sequelize 之前,我们需要先安装它。可以使用以下命令在 Hapi 应用程序中安装 Sequelize:

还需要安装 Sequelize 的一些其他依赖项,包括:

配置

在使用 Sequelize 进行 ORM 操作之前,我们需要配置 Sequelize。首先,我们需要在 Hapi 应用程序中创建一个数据库连接。在更改数据库配置时,我们可以更改 Sequelize 实例的选项。以下代码显示如何配置 Sequelize:

const Sequelize = require('sequelize');
const sequelize = new Sequelize('database', 'username', 'password', {
  dialect: 'mysql',
  host: 'localhost',
  dialectOptions: {
    connectTimeout: 1000
  }
});

其中,databaseusernamepassword 分别是您的数据库、用户名和密码。通过将 dialect 设置为 'mysql',我们指定了要使用的数据库类型。此外,dialectOptions 选项可以用于指定一些特定于 MySQL 的选项。

在连接到数据库后,我们将使用 Sequelize 定义数据库表。这些表定义称为 Sequelize 模型。我们可以创建一个包含所有模型的目录,并使用 Sequelize CLI 自动生成这些模型。在目标目录中,只需要运行以下命令即可:

执行后,会生成多个目录和文件。其中 models 目录包含所有模型定义。所有的模型定义都存储在该目录下。通过运行以下命令,可以创建一个具体的模型:

该命令将在 models 目录下生成一个 User.js 文件,其包含了我们定义的所有参数以及其对应类型的值。

使用 Hapi 实现 Sequelize 查询

在我们的服务实现中,我们可以使用 sequelizesequelize-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