likes
comments
collection
share

全栈项目开发——NOTEBOOK(3):封装数据库实现不同的用户登入校验

作者站长头像
站长
· 阅读数 15

前言

在上篇文章中我们实现了前后端的交互,解决了跨域问题。接下来我们需要将用户输入的值与数据库中的数据进行比较,如何连接数据库,查询数据库中的数据呢?这就是我们接下来需要解决的问题

一,封装准备

连接数据库

连接数据库,就是将后端与我们电脑上的Mysql相关联。在这里数据库中的数据我已经为大家准备好,打开VScode中的MySQL插件,输入名称和密码成功连接数据库。

全栈项目开发——NOTEBOOK(3):封装数据库实现不同的用户登入校验

配置数据库

为增强项目部署的灵活性和维护性,我们设计一个配置管理机制。通过设立config/目录,集中配置数据库连��信息及环境特定配置。当项目迁移至新服务器或环境时,若数据库配置变动,只需在配置文件中更新,无需深入代码修改。这一策略简化了部署流程,降低了错误风险,确保项目高效运行。

配置内容:数据库名称(DATABASE)、用户名(USERNAME)、密码(PASSWORD)、端口号(PORT)和主机地址(HOST)。

配置数据库:

const config = {
    database: {
        DATABASE: 'notebook',
        USERNAME: 'root',
        PASSWORD: '111111',
        PORT: '3306',
        HOST: 'localhost'
    }
}

module.exports = config

封装数据库

新建controllers/文件夹,封装Node.js与本地MySQL数据库的交互逻辑。通过引入npm中的mysql2依赖,实现高效、安全的数据库连接与操作。此文件夹内的代码将作为中介,连接Node.js应用与MySQL数据库,促进代码清晰、易于管理,并增强应用的可维护性。

1. 引入mysql2

npm i mysql2

2. 在官方文档中查看用法

npm | Home (npmjs.com)

二,封装数据库

1. 创建连接池

连接池的创建方法: 全栈项目开发——NOTEBOOK(3):封装数据库实现不同的用户登入校验

  • 引入依赖包 mysql2/promise
  • mysql2/promisemysql2模块的一个部分,它通过Promise API封装了MySQL数据库的连接和操作,简化了异步数据库调用的处理,使代码更加清晰和易于维护。它允许开发者以链���调用或async/await的方式执行数据库操作。
  • 引入我们配置好的 config
  • config包含数据库连接所需的配置信息,这些配置信息被用作参数来创建数据库连接池
// 封装数据库,链接MYSQL
// 允许我们在node.js上链接我们本地的MYSQL
const mysql = require('mysql2/promise');
const config = require('../config/index.js');

// 创建新的线程连接mysql,查看文档,创造线程池
const pool = mysql.createPool({
// config文件夹下database对象中的各个属性
    database: config.database.DATABASE,
    user: config.database.USERNAME,
    password: config.database.PASSWORD,
    port: config.database.PORT,
    host: config.database.HOST
});

2. 使用连接池查询

如何使用连接池进行查询操作我们需要认真阅读文档

连接池的使用方法:

全栈项目开发——NOTEBOOK(3):封装数据库实现不同的用户登入校验

运用知识点:

1. 获取数据

通过线程池pool的 getConnection 方法创建连接,再实例化为conn以便获取连接池中的数据

2. SQL查询

  • SQL查询用于从数据库中检索、插入、更新或删除数据。

  • 我们使用conn.query(sql, values)执行数据库查询并获取结果返回一个数组,用const [rows, fields]去承接返回的结果。

  • rows是一个数组,包含了查询结果的所有行。每一行都是一个对象,对象的属性对应于查询结果集中的列。

  • fields是一个对象数组,描述了结果集中每一列的信息,比如列名、数据类型等。但在许多情况下,fields可能不会被直接使用,因为主要关注的是rows

3. 释放连接

遵循文档使用方法,使用 pool.releaseConnection(conn) 释放连接

4. 错误捕获机制

通过return Promise.resolve(rows);返回查询结果;

如果在执行查询或获取连接的过程中发生错误,catch块会捕获这个错误,并通过return Promise.reject(err);将错误作为Promise的拒绝原因返回。

实际操作:

 // 查询数据库中所有数据
const allServices = {
    async Query(sql, values) {
        try {
            // 通过线程池pool的getConnection方法,将pool的值给到conn
            const conn = await pool.getConnection();
            // 对连接执行某些操作,rows就是sql
            const [rows, fields] = await conn.query(sql, values)
            // 释放连接
            pool.releaseConnection(conn);
            // 返回查询结果
            return Promise.resolve(rows);
        } catch (err) {
        // 抓捕错误
            return Promise.reject(err);
        }
    }
}

总结: 该代码定义了一个对象allServices,包含一个异步方法Query,该方法通过数据库连接池pool获取连接,执行SQL查询拿到所有行列。使用错误捕获机制处理查询结果或异常

SQL查询的用意是根据提供的SQL语句和参数值,从数据库中检索数据并返回结果集

三,用户登录验证

现在我们成功的打造了一个方法 Query 用来查询数据库中的服务对象,接下来我们需要将用户输入与数据库中的服务对象比对,如果成功就会返回对应的用户信息。

对应的账号密码拿到对应的数据

观察我们的数据表,我们使用SQL语句查询users表中的usernamepassword字段,当用户输入与表中给定的用户名和密码值相同时,返回对应列信息。

全栈项目开发——NOTEBOOK(3):封装数据库实现不同的用户登入校验

封装 userLogin :当用户输入正确密码账号时,userLogin 将拥有对应列的所有信息

// 检验用户输入
const userLogin = (username, password) => {
    // 使用SQL语句查找
    let _sql = `select * from users where username="${username}" and password="${password}";`
    // 将对应列信息传给userLogin
    return allServices.Query(_sql)
}

代码解析:

  • select * from users表示从users表中选取所有列(*

  • usernamepassword字段分别匹配变量值${username}${password}时,选取该列。

  • allServices.Query()因为SQL查询语句能够从数据库中查询检索数据。

  • 将 _sql 当参数传进去,使得他能利用函数查询所有数据库中的所有数据,然后通过自己的SQL语句进行比对操作

比对前端传入的账号密码

抛出我们封装好的 userLogin,在router中引入

module.exports = {
    userLogin
}

我们在router中配置了路由,拿到了前端传输过来的账号和密码,现在我们需要将前端传输过来的参数与数据库中的比对。就是将前端传递账号和密码的与 userLogin 中的username,password 比对。

const router = require('koa-router')()
// 引入抛出的封装好了的userLogin
const { userLogin } = require('../controllers/index.js')

// 添加路由前缀
router.prefix('/user')

router.post('/login', async (ctx) => {
    // 获取前端传递过来的账号和密码
    const { username, password } = ctx.request.body
    // 在数据库中校验
    const result = await userLogin(username, password)
    console.log(result);
})
// 抛出封装的router
module.exports = router

代码解析: 将前端传递的 username, password 传入到 userLogin() 中,userLogin将运行机制:比对参数,返回对应值。我们可以通过 console.log打印对应值,但因为数据比对需要时间,我们需要使用 async/await 来控制代码执行顺序。

最后实现功能:当输入的账号密码正确时,返回对应数据

全栈项目开发——NOTEBOOK(3):封装数据库实现不同的用户登入校验

小计

在这节课的学习中我们通过引入mysql2/promise将Node.js应用与MySQL数据库连接,并创建了连接池。通过打造的Query方法,我们能够执行SQL查询,验证用户输入的账号和密码,实现了账号和密码在数据库中的校验。

这一过程中,我们不仅掌握了数据库连接与查询的技术,还通过前端交互展示了不同输入下的数据反馈,实现了数据的实时处理和展示,增强了应用的交互性和用户体验。

本期要点:MySQL插件连接数据库 , config/文件配置数据库 , 封装数据库 , mysql2 ,mysql2/promise ,创建连接池pool , getConnection() , SQL查询 , releaseConnection() , async/await/Promise.resolve/reject() , SQL语句

全栈项目开发——NOTEBOOK(3):封装数据库实现不同的用户登入校验

转载自:https://juejin.cn/post/7397288963629678626
评论
请登录