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日

相关文章

  • node.js实现复制文本到剪切板的功能

    要实现在node.js中复制文本到剪切板,需要用到一个名为”clipboardy”的第三方库。下面是详细的攻略: 安装clipboardy库 在终端中输入以下命令进行安装: npm install clipboardy –save 安装完成后,就可以在代码中调用它的API了。 将文本复制到剪切板 使用clipboardy库,可以将文本复制到剪切板中。以下是…

    node js 2023年6月8日
    00
  • 使用Vue3实现羊了个羊的算法

    首先,我们需要了解Vue3的基础知识,并安装Vue3及相关插件。接下来,我们可以按照以下步骤实现“羊了个羊”的算法: 创建Vue3项目 在终端中输入以下命令来创建Vue3项目: vue create my-project 然后选择手动配置,安装Babel、Router、Vuex,并选择ESLint+Prettier作为代码风格工具。 安装必要的插件 在终端中…

    node js 2023年6月8日
    00
  • 详解nodejs操作mongodb数据库封装DB类

    下面我将为你详细讲解“详解nodejs操作mongodb数据库封装DB类”的完整攻略。 1. 前言 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时,使用它可以在服务端运行 JavaScript 程序。而 MongoDB 是一个基于文档模型的 NoSQL 数据库。Node.js 与 MongoDB 的结合是一种非常常见而又…

    node js 2023年6月8日
    00
  • 用npm-run实现自动化任务的方法示例

    使用npm-run可以在package.json文件中定义自动化任务,方便开发者执行常用操作,例如编译代码、运行测试等。下面是通过npm-run实现自动化任务的方法示例: 1. 在package.json中定义自动化任务 在package.json文件中添加”scripts”属性,使用该属性定义自动化任务的名称和命令。例如: { "name&quo…

    node js 2023年6月8日
    00
  • Nodejs获取网络数据并生成Excel表格

    标题:Nodejs获取网络数据并生成Excel表格 1. 介绍 Nodejs是一门基于JavaScript语法的运行时环境或平台,它可以帮助我们开发高效、可扩展的网络应用程序。在本文中,我们将会学习如何使用Nodejs来获取网络数据,并将数据生成Excel表格。 2. 安装依赖包 使用Nodejs获取网络数据并生成Excel表格,我们需要安装以下依赖包: r…

    node js 2023年6月8日
    00
  • Node.js微信 access_token ( jsapi_ticket ) 存取与刷新的示例

    针对Node.js微信 access_token (jsapi_ticket) 存取与刷新的示例,我们可以按照以下步骤进行攻略: 第一步:获取access_token和jsapi_ticket 我们可以通过以下方式获取微信公众平台的access_token和jsapi_ticket: 获取access_token const request = requir…

    node js 2023年6月8日
    00
  • 2023年全网最新Node.js下载安装教程

    2023年全网最新Node.js下载安装教程 简介 Node.js是一个基于Chrome V8引擎的JavaScript运行环境,可以使JavaScript在服务器端运行,极大地提高了JavaScript的运行效率。本文将为大家详细讲解2023年全网最新Node.js下载安装教程,以便大家能够快速正确地安装Node.js。 步骤 访问Node.js官网:ht…

    node js 2023年6月8日
    00
  • javascript实现双端队列

    下面是详细讲解 JavaScript 实现双端队列的完整攻略,包含以下内容: 双端队列的介绍 实现双端队列的方法 示例说明 1. 双端队列的介绍 双端队列是一种特殊的队列,它允许从两端进行数据的插入和删除操作。与普通队列相比,双端队列拥有更加丰富的操作,可以满足更多的需求。 2. 实现双端队列的方法 实现双端队列的方法有多种,其中最常见的方法是使用数组来实现…

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