NodeJs+MySQL实现注册登录功能

  1. 总体架构

NodeJs是一种基于事件驱动、非阻塞I/O模型的JavaScript后端运行环境,它提供了众多的系统模块和第三方模块,以及一个强大的包管理工具npm。MySQL是一种流行的关系型数据库管理系统,提供了完善的数据库设计和管理工具,以及一套丰富的SQL语言和API。

注册登录功能的实现,主要涉及以下几个环节:

  • 用户信息的采集和存储;
  • 用户名和密码的加密处理;
  • 用户名和密码的校验和匹配;
  • 登录状态的管理和维护。

具体来说,可以采用NodeJs的Express框架搭建Web服务端,使用MySQL的NodeJs驱动模块mysql模块连接和操作数据库,实现前端和后端的交互和数据传输。

  1. 具体步骤

2.1 初始化项目

在本地创建一个新的项目文件夹,进入该文件夹,在命令行中输入以下命令:

npm init

按照提示完成基本信息的填写,生成一个package.json文件,记录项目依赖的模块和版本号。

2.2 安装依赖模块

本次项目需要用到以下模块:

  • express:用于搭建Web框架和处理HTTP请求;
  • body-parser:用于解析HTTP request body 中的数据,如POST请求中的数据;
  • mysql:用于连接和操作MySQL数据库;
  • bcryptjs:用于对用户密码进行加密处理。

可以运行以下命令一键安装:

npm install express body-parser mysql bcryptjs

2.3 创建数据库

在MySQL中创建一个新的数据库(如mydb),用于存储用户信息和登录状态的数据表。可以运行以下命令初始化一个users表:

CREATE TABLE users (
    id INT NOT NULL AUTO_INCREMENT,
    username VARCHAR(255) UNIQUE NOT NULL,
    email VARCHAR(255) UNIQUE NOT NULL,
    password VARCHAR(255) NOT NULL,
    PRIMARY KEY (id)
);

2.4 创建Express应用

在项目根目录下创建一个index.js文件,输入以下代码:

const express = require('express');
const bodyParser = require('body-parser');
const mysql = require('mysql');

const app = express();

// 中间件:解析HTTP请求体中的JSON数据
app.use(bodyParser.json());

// HTTP GET /api/users ==> query all users
app.get('/api/users', (req, res) => {
    // TODO: query all users from database and send response
});

// HTTP POST /api/register ==> register a new user
app.post('/api/register', (req, res) => {
    // TODO: collect user data from request body, encrypt password, and insert into database
});

// HTTP POST /api/login ==> authenticate user and create session
app.post('/api/login', (req, res) => {
    // TODO: collect user data from request body, query user from database, verify password, and create session
});

// HTTP GET /api/logout ==> destroy session
app.get('/api/logout', (req, res) => {
    // TODO: destroy session
});

// start the server listening at port 3000
const server = app.listen(3000, () => {
    const { address, port } = server.address();
    console.log(`Express server listening on http://${address}:${port}`);
});

2.5 连接数据库

在index.js文件中添加如下代码段:

// 数据库连接配置
const dbConfig = {
    host: 'localhost',
    user: 'root',
    password: 'password',
    database: 'mydb',
};

// 创建数据库连接池
const dbPool = mysql.createPool(dbConfig);

// 中间件:将数据库连接池添加到Request对象中,方便在路由中使用
app.use((req, res, next) => {
    req.dbPool = dbPool;
    next();
});

2.6 收集用户信息

在注册和登录路由函数中,需要从HTTP请求对象的body中提取用户名、邮箱和密码等必要信息。可以使用如下代码:

const { username, email, password } = req.body;

接下来,需要对密码进行加密处理,以避免明文存储导致的安全问题。可以使用bcryptjs模块提供的hashSync函数,将明文密码转换为哈希值:

const bcrypt = require('bcryptjs');
const saltRounds = 10;
const hashedPassword = bcrypt.hashSync(password, saltRounds);

2.7 插入数据库

在注册路由函数中,需要将用户信息插入到MySQL数据库的users表中。可以使用如下代码:

const sql = 'INSERT INTO users (username, email, password) VALUES (?, ?, ?)';
const values = [username, email, hashedPassword];
req.dbPool.query(sql, values, (error, results, fields) => {
    if (error) {
        console.error(error);
        res.status(500).send('Internal Server Error');
    } else {
        console.log(`New user ${username} successfully registered`);
        res.send('OK');
    }
});

2.8 验证用户身份

在登录路由函数中,需要从MySQL数据库的users表中查询用户名匹配的用户,并验证其密码是否正确。可以使用如下代码:

const sql = 'SELECT * FROM users WHERE username = ? OR email = ?';
const values = [username, email];
req.dbPool.query(sql, values, (error, results, fields) => {
    if (error) {
        console.error(error);
        res.status(500).send('Internal Server Error');
    } else if (results.length == 0) {
        console.warn(`User ${username} not found`);
        res.status(401).send('Invalid username or password');
    } else {
        const user = results[0];
        if (bcrypt.compareSync(password, user.password)) {
            console.log(`User ${username} successfully logged in`);
            // TODO: create session and send response
        } else {
            console.warn(`User ${username} entered wrong password`);
            res.status(401).send('Invalid username or password');
        }
    }
});

2.9 保存登录状态

在创建登录成功的Session之后,需要将Session ID保存到客户端的Cookie中,并设置过期时间。可以使用如下代码:

const maxAge = 24 * 60 * 60 * 1000; // session剩余24小时有效期
res.cookie('session_id', sessionId, { maxAge });

同时,需要处理用户访问需要授权的API时的验证逻辑,可以使用如下代码:

// 中间件:验证用户登录状态
app.use('/api', (req, res, next) => {
    const sessionId = req.cookies.session_id;
    // TODO: verify session
    if (isSessionValid) {
        next();
    } else {
        res.status(401).send('Unauthorized');
    }
});
  1. 示例说明

3.1 示例1:注册新用户

在客户端发起HTTP POST请求/ api/register,携带如下数据:

{
    "username": "alice",
    "email": "alice@example.com",
    "password": "123456"
}

服务器收到请求后,从request body中提取数据,对密码进行加密处理,通过MySQL的INSERT语句将用户信息插入到数据库中。

如果成功注册,则返回HTTP响应码200 OK,否则返回HTTP响应码500 Internal Server Error或401 Invalid username or password。

3.2 示例2:登录用户

在客户端发起HTTP POST请求/ api/login,携带如下数据:

{
    "username": "alice",
    "password": "123456"
}

服务器收到请求后,从request body中提取数据,查询MySQL数据库的users表中是否存在该用户(用username或email匹配),验证密码是否正确。

如果用户名和密码匹配,则创建新的Session,保存Session ID到客户端的Cookie中,返回HTTP响应码200 OK。

如果用户名或密码不匹配,则返回HTTP响应码401 Invalid username or password。

3.3 示例3:访问授权接口

在客户端发起HTTP GET请求/ api/users,访问需要授权的API时,服务器首先检查客户端的Cookie中是否包含有效的Session ID,如果是,则允许访问,否则返回HTTP响应码401 Unauthorized。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:NodeJs+MySQL实现注册登录功能 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • JS实现返回上一页并刷新页面的方法分析

    JS实现返回上一页并刷新页面的方法分析 在 Web 开发中,有时候需要在页面跳转后返回上一页并刷新页面,这可以通过 JavaScript 来实现。针对这个需求,本文将介绍两种实现方法。 方法一:使用window.location.reload() window.location.reload() 方法可以重新加载当前页面,结合 history.go(-1) …

    node js 2023年6月8日
    00
  • JavaScript 中如何拦截全局 Fetch API 的请求和响应问题

    对于拦截全局 Fetch API 的请求和响应问题,我们可以使用 window.fetch 方法的第二个参数 init 来进行拦截。init 是一个配置对象,包含了 HTTP 请求的相关配置,其中,我们可以设置 init 中的 headers 属性来拦截请求和响应。 拦截 Fetch 请求 为了拦截 Fetch 请求,我们可以在 headers 中添加 fe…

    node js 2023年6月8日
    00
  • 跟我学Nodejs(三)— Node.js模块

    下面我来讲解一下“跟我学Nodejs(三)— Node.js模块”的完整攻略。 什么是Node.js模块? Node.js是一个支持模块化的平台,它提供一种可以在不同脚本之间共享代码的机制。Node.js在启动时自动加载并编译保存在指定位置的模块。 模块可以是单个文件、文件夹(包含index.js文件)或者是一个core module。Node.js有很…

    node js 2023年6月8日
    00
  • 详解nodejs 文本操作模块-fs模块(四)

    详解nodejs 文本操作模块-fs模块(四) 在 nodejs 中,fs 模块是处理文件和目录的核心模块。在读取或写入文本数据时,fs 模块提供了多种方法和选项。本文将详细讲解如何使用 fs 模块进行文本操作。 读取文本文件 使用 fs.readFile() 方法可以读取文本文件。该方法包含三个参数:文件路径、编码格式和回调函数。例如,下面的示例将读取指定…

    node js 2023年6月8日
    00
  • Node.js API详解之 querystring用法实例分析

    Node.js API详解之 querystring用法实例分析 什么是querystring querystring 模块是一个 Node.js 内置模块,主要用于解析和序列化 URL 查询字符串。它提供了一些方法,可以帮助开发者解析和序列化来自http请求、http响应以及url对象的查询字符串数据。这个模块能在两种操作之间进行转换。 querystri…

    node js 2023年6月8日
    00
  • 三分钟教会你用nodejs操作mysql数据库

    使用 Node.js 操作 MySQL 数据库是一件非常重要的事情,特别是对于 Node.js 开发人员来说,因为这可以帮助他们更好地处理和管理数据。在下面的对话中,我将分享一个简单的三分钟攻略,以向您展示如何使用 Node.js 操作 MySQL 数据库。 1. 安装 MySQL 首先,我们需要在本地计算机上安装 MySQL。MySQL 是一个流行的开源数…

    node js 2023年6月8日
    00
  • Vue实现virtual-dom的原理简析

    Vue实现virtual-dom的原理简析 virtual-dom 是什么 virtual-dom 是将 dom 树以 js 对象的方式进行表示,实际上是对真实 dom 树的一种抽象。它可以将 js 对象(virtual-dom)在浏览器中渲染成真实的 dom。 Vue 中的 virtual-dom 在 Vue 中,当我们的数据做出改变时,Vue 会对比修改…

    node js 2023年6月8日
    00
  • Nodejs下用submit提交表单提示cannot post错误的解决方法

    当我们在Node.js环境下使用submit提交表单时,有时会出现“cannot post”错误,这是因为Node.js的http模块并不支持表单类型的提交方式。在这种情况下,我们需要对请求进行处理,以使其能够正确地被Node.js服务器处理。下面详细讲解如何解决这个问题。 首先,在Node.js中,我们可以使用http模块来创建一个服务器。使用该模块创建的…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部