而MySQL,作为一款开源的关系型数据库管理系统,凭借其稳定性、可靠性和广泛的应用场景,成为了众多开发者首选的数据存储解决方案
将Node.js与MySQL结合使用,不仅能够发挥Node.js在处理并发请求上的优势,还能借助MySQL强大的数据管理功能,构建出既高效又可靠的全栈Web应用
本文将通过一个实战项目的深度解析,带你领略Node.js与MySQL联手的强大魅力
一、项目背景与目标设定 假设我们需要开发一个在线书店管理系统,该系统允许用户浏览书籍列表、搜索特定书籍、查看书籍详情、添加书籍到购物车并最终完成购买
该系统需要具备用户注册与登录功能,同时管理员能够管理书籍库存、查看订单信息等
选择Node.js作为后端框架,MySQL作为数据库,旨在打造一个响应迅速、数据一致性强、易于维护和扩展的Web应用
二、技术选型与环境搭建 技术栈 -后端:Node.js,利用Express框架快速搭建服务器
-数据库:MySQL,存储用户信息、书籍数据、订单记录等
-前端:React或Vue.js(为简化示例,本文前端部分将简要提及,重点在后端实现)
-包管理工具:npm,管理项目依赖
-其他工具:Sequelize(ORM框架,简化数据库操作)、bcrypt(密码哈希)、jsonwebtoken(JWT,实现用户认证)
环境搭建 1.安装Node.js:从Node.js官网下载安装包,按照提示完成安装
2.初始化项目:使用npm init -y命令创建一个新的Node.js项目
3.安装依赖:通过`npm install express mysql2 sequelize bcrypt jsonwebtoken`等命令安装所需依赖
4.配置MySQL:安装MySQL数据库,创建数据库和用户,并赋予相应权限
三、项目实战:后端开发 1. 数据库设计与模型创建 首先,根据业务需求设计数据库表结构
至少需要以下几张表: -Users:存储用户信息,包括用户名、密码哈希、邮箱等
-Books:存储书籍信息,包括书名、作者、ISBN、价格、库存量等
-Orders:存储订单信息,包括订单ID、用户ID、订单状态、创建时间等
-OrderItems:存储订单详情,包括订单ID、书籍ID、数量等
使用Sequelize定义模型: javascript const{ Sequelize, DataTypes, Model} = require(sequelize); const sequelize = new Sequelize(database_name, username, password,{ host: localhost, dialect: mysql }); class User extends Model{} User.init({ username:{ type: DataTypes.STRING, allowNull: false, unique: true }, password:{ type: DataTypes.STRING, allowNull: false }, email:{ type: DataTypes.STRING, allowNull: false, unique: true } },{ sequelize, modelName: User}); //类似地定义Books, Orders, OrderItems模型 2. 用户注册与登录 -注册:接收用户提交的表单数据,验证输入的有效性,使用bcrypt对密码进行哈希处理,然后将用户信息保存到数据库
-登录:验证用户输入的用户名和密码,若匹配成功,生成JWT令牌并返回给客户端,用于后续请求的认证
javascript const bcrypt = require(bcrypt); const jwt = require(jsonwebtoken); // 用户注册路由 app.post(/register, async(req, res) =>{ const{ username, password, email} = req.body; const hashedPassword = await bcrypt.hash(password,10); const user = await User.create({ username, password: hashedPassword, email}); res.status(201).send({ message: User registered successfully, user}); }); // 用户登录路由 app.post(/login, async(req, res) =>{ const{ username, password} = req.body; const user = await User.findOne({ where:{ username}}); if(!user ||!await bcrypt.compare(password, user.password)){ return res.status(401).send({ message: Invalid credentials}); } const token = jwt.sign({ userId: user.id}, your_jwt_secret,{ expiresIn: 1h}); res.send({ token}); }); 3.书籍管理与购物车功能 -获取书籍列表:从Books表中查询所有书籍信息并返回
-搜索书籍:根据用户输入的关键词,在书名或作者字段中进行模糊查询
-添加到购物车:实现一个中间件,验证JWT令牌的有效性,然后根据用户ID和书籍ID,将书籍添加到用户的购物车(可以是数据库中的一个临时表或内存中的数据结构)
javascript // 获取书籍列表路由 app.get(/books, async(req, res) =>{ const books = await Book.findAll(); res.send(books); }); //搜索书籍路由 app.get(/search, async(req, res) =>{ const{ keyword} = req.query; const books = await Book.findAll({ where:{ 【Sequelize.Op.or】:【 { title:{【Sequelize.Op.like】:`%${keyword}%`}}, { author:{【Sequelize.Op.like】:`%${keyword}%`}} 】 }}); res.send(books); }); // 中间件:验证JWT令牌 const a