Node.js,作为一个基于Chrome V8引擎的JavaScript运行时环境,以其事件驱动、非阻塞I/O模型的特性,成为了构建高性能网络应用的热门选择
而MySQL,作为开源的关系型数据库管理系统,凭借其稳定性、灵活性和广泛的社区支持,成为了数据存储的首选之一
将这两者结合,可以打造出既快速响应又具备强大数据处理能力的后端服务
本文将通过一个实战项目,深入探讨如何利用Node.js与MySQL构建这样的服务
一、项目背景与目标设定 假设我们要开发一个在线书店管理系统,它允许用户浏览书籍、搜索书籍、添加到购物车、下单购买以及管理个人账户信息
该项目旨在展示如何通过Node.js处理HTTP请求、使用Express框架简化路由管理、连接并操作MySQL数据库,以及实现用户认证与授权等核心功能
二、技术选型与环境搭建 2.1 技术栈 -Node.js:作为后端运行环境,提供高效的异步I/O处理能力
-Express:快速、灵活、极简的Node.js Web应用框架
-MySQL:关系型数据库,用于存储书籍、用户、订单等数据
-Sequelize:基于Promise的Node.js ORM(对象关系映射)框架,用于简化数据库操作
-bcrypt:用于密码哈希,增强安全性
-JWT(JSON Web Tokens):实现用户认证与授权
2.2 环境配置 1.安装Node.js:从Node.js官网下载安装包并安装
2.安装MySQL:通过MySQL官网下载安装包,或使用Docker容器快速部署
3.初始化Node.js项目: bash mkdir bookstore-app cd bookstore-app npm init -y 4.安装依赖: bash npm install express mysql2 sequelize bcrypt jsonwebtoken body-parser 三、项目结构与设计 3.1 项目目录结构 bookstore-app/ ├── config/ │└── database.js 数据库配置文件 ├── controllers/ │├── authController.js 用户认证控制器 │├── bookController.js书籍控制器 │└── orderController.js订单控制器 ├── models/ │├── user.js 用户模型 │├── book.js书籍模型 │└── order.js订单模型 ├── routes/ │├── authRoutes.js 用户认证路由 │├── bookRoutes.js书籍路由 │└── orderRoutes.js订单路由 ├── app.js 主应用文件 ├── package.json └── .env 环境变量配置文件 3.2 数据库设计 设计三个主要表:`users`(用户)、`books`(书籍)、`orders`(订单),并考虑它们之间的关系,如用户与订单的一对多关系
四、核心功能实现 4.1 数据库配置与模型定义 在`config/database.js`中配置数据库连接: javascript const{ Sequelize} = require(sequelize); require(dotenv).config(); const sequelize = new Sequelize(process.env.DB_NAME, process.env.DB_USER, process.env.DB_PASSWORD,{ host: process.env.DB_HOST, dialect: mysql }); module.exports = sequelize; 在`models/`目录下定义User、Book、Order模型,并设置关系
例如,User模型: javascript const{ Model, DataTypes} = require(sequelize); const sequelize = require(../config/database); const bcrypt = require(bcrypt); class User extends Model{} User.init({ username:{ type: DataTypes.STRING, allowNull: false, unique: true }, password:{ type: DataTypes.STRING, allowNull: false }, // 其他字段... },{ sequelize, modelName: User}); // 密码哈希处理 User.beforeCreate(async(user, options) =>{ user.password = await bcrypt.hash(user.password,10); }); User.prototype.comparePassword = function(password){ return bcrypt.compare(password, this.password); }; module.exports = User; 4.2 用户认证与授权 在`controllers/authController.js`中实现注册、登录功能,使用JWT进行用户认证: javascript const jwt = require(jsonwebtoken); const User = require(../models/user); const{ Op} = require(sequelize); require(dotenv).config(); exports.register = async(req, res) =>{ const{ username, password} = req.body; try{ const userExists = await User.findOne({ where:{ username}}); if(userExists){ return res.status(400).json({ message: Username already exists}); } const newUser = await User.create({ username, password}); res.status(201).json({ user: newUser.toJSON()}); } catch(error){ res.status(500).json({ message: error.message}); } }; exports.login = async(req, res) =>{ const{ username, password} = req.body; try{ const user = await User.findOne({ where:{ username}}); if(!user ||!(await user.comparePassword(password))){ return res.status(401).json({ message: Invalid credentials}); } const token = jwt.sign({ id: user.id}, process.env.JWT_SECRET,{ expiresIn: 1h}); res.json({ token}); } catch(error){ res.status(500).json({ message: error.message}); } }; export