NodeJs+MySQL实现注册登录功能

yizhihongxing
  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日

相关文章

  • Node.js包管理器npm的具体使用

    Node.js包管理器npm的具体使用 Node.js包管理器npm是一个用于npm注册表中发布和共享Node.js模块的工具和平台,让开发者可以轻松地创建、分享和使用不同的Node.js模块和包。本文将详细介绍npm的使用流程与相关命令。 安装npm 在使用npm之前,需要先安装Node.js包管理器。可以使用以下命令检查npm是否安装在您的系统中: np…

    node js 2023年6月8日
    00
  • 利用VS Code开发你的第一个AngularJS 2应用程序

    以下是利用VS Code开发AngularJS 2应用程序的完整攻略: 背景介绍 AngularJS 2是一个强大的前端框架,在现代Web开发中被广泛使用。VS Code是一个轻量级的代码编辑器,支持很多编程语言,适合前端开发人员。在本攻略中,我们将介绍如何使用VS Code为AngularJS 2开发一个简单的应用程序。 环境准备 Node.js的安装:我…

    node js 2023年6月8日
    00
  • 实例详解AngularJS实现无限级联动菜单

    实现无限级联动菜单的步骤 第一步:引入AngularJS 在HTML文件中引入AngularJS库,可以使用CDN或者下载本地文件。例如: <script src="https://cdn.bootcdn.net/ajax/libs/angular.js/1.8.2/angular.min.js"></script&gt…

    node js 2023年6月8日
    00
  • Typescript tsconfig.json的配置详情

    当我们使用Typescript进行开发时,需要通过tsconfig.json文件来配置编译器的行为。tsconfig.json是一个JSON文件,通过它可以配置Typescript编译器进行代码的编译及输出。下面来讲解”Typescript tsconfig.json的配置详情”,其中包括编译选项、模块选项、引用选项、源文件选项等内容。 编译选项 编译选项是…

    node js 2023年6月8日
    00
  • node.js中的console用法总结

    console的基本用法 console是node.js中一个非常重要的模块,用于在控制台输出日志信息。console的基本用法非常简单,只需要调用其中的log方法即可输出信息。 console.log(‘Hello World’); 上述代码将在控制台输出”Hello World”。 除了基本的log方法外,console还提供了其他方法: console…

    node js 2023年6月8日
    00
  • 一文详解Node.contain 函数兼容处理

    一文详解Node.contains函数兼容处理 介绍 Node.contains函数是DOM API中比较常用的一个函数,用来判断一个DOM元素是否包含另一个DOM元素。但是在不同的浏览器环境下,该函数的返回值不完全一致,因此需要进行兼容处理。本文将详细介绍Node.contains函数的用法以及兼容处理的方法。 Node.contains函数用法 Node…

    node js 2023年6月8日
    00
  • Node.js实现在目录中查找某个字符串及所在文件

    首先,实现在目录中查找某个字符串及所在文件的过程需要借助Node.js的文件系统(fs)模块和字符串操作相关的库,比如string-search、string-similarity等。 以下是详细的实现步骤: 1.安装依赖库 npm install string-search 2.编写Node.js代码 const fs = require(‘fs’); c…

    node js 2023年6月8日
    00
  • Node.JS更改Windows注册表Regedit的方法小结

    按照你的要求,我来详细讲解一下“Node.JS更改Windows注册表Regedit的方法小结”的完整攻略。 目录 介绍 使用Node.js修改Windows注册表 安装必要模块 读取注册表 写入注册表 删除注册表 示例说明 示例1: 修改注册表键值 示例2: 删除注册表项 介绍 Windows系统中的注册表是系统的关键组件之一,管理着许多应用程序和操作系统…

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