当前位置: 首页 > news >正文

Vue:后端服务代码解析

原代码:

const express = require('express');
const mysql = require('mysql2/promise'); // 使用promise版本
const cors = require('cors');const app = express();
app.use(cors());
app.use(express.json()); // 解析JSON请求体// 数据库连接池
const pool = mysql.createPool({host: 'localhost',port: 3306,user: 'root',password: '123456',database: 'admin_system',waitForConnections: true,connectionLimit: 10,queueLimit: 0
});// 管理员数据API
app.get('/api/administrators', async (req, res) => {try {const [rows] = await pool.query(`SELECT id, admin_name, login_time, status FROM administrators ORDER BY login_time DESC`);res.json(rows);} catch (error) {console.error('数据库查询错误:', error);res.status(500).json({ error: '数据库查询失败' });}
});// 创建管理员API
app.post('/api/administrators', async (req, res) => {const { name } = req.body;if (!name) {return res.status(400).json({ error: '角色类型不能为空' });}try {const [result] = await pool.query(`INSERT INTO administrators (admin_name, login_time) VALUES (?, NOW())`,[name]);res.json({id: result.insertId,message: '创建成功'});} catch (error) {console.error('创建管理员失败:', error);res.status(500).json({ error: '创建失败' });}
});// 删除管理员API
app.delete('/api/administrators/:id', async (req, res) => {const id = req.params.id;try {const [result] = await pool.query(`DELETE FROM administrators WHERE id = ?`,[id]);if (result.affectedRows === 0) {return res.status(404).json({ error: '未找到该管理员' });}res.json({ message: '删除成功' });} catch (error) {console.error('删除管理员失败:', error);res.status(500).json({ error: '删除失败' });}
});// 更新管理员APIapp.put('/api/administrators/:id', async (req, res) => {const id = req.params.id;const { name, status } = req.body;try {const [result] = await pool.query(`UPDATE administrators SET admin_name = ?, status = ?, login_time = NOW()WHERE id = ?`,[name, status, id]);if (result.affectedRows === 0) {return res.status(404).json({ error: '未找到该管理员' });}res.json({ message: '更新成功' });} catch (error) {console.error('更新管理员失败:', error);res.status(500).json({ error: '更新失败' });}
});// 启动服务器
const PORT = 3000;
app.listen(PORT, () => {console.log(`后端服务运行在 http://localhost:${PORT}`);
});

详细代码解析

1. 模块引入

const express = require('express');
const mysql = require('mysql2/promise'); 
const cors = require('cors');

解释

  • express: Node.js web框架,用于创建服务器和路由

  • mysql2/promise: MySQL数据库的Promise封装版,支持async/await

  • cors: 跨域资源共享中间件,解决前端跨域问题

2. Express应用初始化

const app = express();
app.use(cors());
app.use(express.json());

解释

  • 创建Express应用实例

  • app.use(cors()): 启用CORS中间件,允许所有跨域请求

  • app.use(express.json()): 启用JSON请求体解析中间件

3. 数据库连接池配置

const pool = mysql.createPool({host: 'localhost',      // 数据库主机port: 3306,             // 数据库端口user: 'root',           // 数据库用户名password: '123456',     // 数据库密码database: 'admin_system', // 使用的数据库waitForConnections: true, // 等待连接connectionLimit: 10,    // 连接池最大连接数queueLimit: 0           // 排队请求数量限制(0表示不限制)
});

解释

  • 创建MySQL连接池以提高性能

  • connectionLimit: 10: 最大10个并发连接

  • waitForConnections: true: 连接池满时排队等待

  • queueLimit: 0: 等待队列无限长

4. 管理员数据API (GET)

app.get('/api/administrators', async (req, res) => {try {// 执行SQL查询,从administrators表中选择id, admin_name, login_time, status,并按登录时间降序排列const [rows] = await pool.query(`SELECT id, admin_name, login_time, status FROM administrators ORDER BY login_time DESC`);// 将查询结果以JSON格式返回res.json(rows);} catch (error) {console.error('数据库查询错误:', error);res.status(500).json({ error: '数据库查询失败' });}
});

解释

  • GET请求端点 /api/administrators

  • 查询管理员表并按登录时间倒序排列

  • 成功返回JSON数据,失败返回500错误

5. 创建管理员API (POST)

app.post('/api/administrators', async (req, res) => {const { name } = req.body; // 从请求体中获取nameif (!name) {return res.status(400).json({ error: '角色类型不能为空' });}try {// 执行插入操作,将新管理员的名字和当前时间插入数据库const [result] = await pool.query(`INSERT INTO administrators (admin_name, login_time) VALUES (?, NOW())`,[name]);// 返回新创建的管理员ID和成功消息res.json({id: result.insertId,message: '创建成功'});} catch (error) {console.error('创建管理员失败:', error);res.status(500).json({ error: '创建失败' });}
});

解释

  • POST请求端点,创建新管理员

  • 验证请求体中name参数必填

  • 使用NOW()函数自动设置当前时间

  • 返回新创建的管理员ID

6. 删除管理员API (DELETE)

app.delete('/api/administrators/:id', async (req, res) => {const id = req.params.id; // 从URL参数中获取要删除的管理员IDtry {// 根据ID删除管理员const [result] = await pool.query(`DELETE FROM administrators WHERE id = ?`,[id]);// 如果影响行数为0,表示没有找到该记录if (result.affectedRows === 0) {return res.status(404).json({ error: '未找到该管理员' });}res.json({ message: '删除成功' });} catch (error) {console.error('删除管理员失败:', error);res.status(500).json({ error: '删除失败' });}
});

解释

  • DELETE请求端点,使用URL参数:id

  • 检查affectedRows确认记录是否存在

  • 不存在返回404,存在返回成功消息

7. 更新管理员API (PUT)

app.put('/api/administrators/:id', async (req, res) => {const id = req.params.id;const { name, status } = req.body;try {const [result] = await pool.query(`UPDATE administrators SET admin_name = ?, status = ?, login_time = NOW()WHERE id = ?`,[name, status, id]);if (result.affectedRows === 0) {return res.status(404).json({ error: '未找到该管理员' });}res.json({ message: '更新成功' });} catch (error) {console.error('更新管理员失败:', error);res.status(500).json({ error: '更新失败' });}
});

解释

  • PUT请求端点,更新管理员信息

  • 同时更新admin_namestatuslogin_time

  • 使用NOW()重置登录时间为当前时间

8. 服务器启动

const PORT = 3000;
app.listen(PORT, () => {console.log(`后端服务运行在 http://localhost:${PORT}`);
});

解释

  • 监听3000端口启动服务器

  • 启动后输出运行地址到控制台

主要特点总结

  1. RESTful API设计:符合标准的GET/POST/PUT/DELETE方法

  2. 安全防护

    • SQL参数化查询防止注入攻击

    • 完善的错误处理和状态码返回

  3. 性能优化

    • 使用数据库连接池管理连接

    • Promise异步处理避免阻塞

  4. 健壮性

    • 所有操作都有try-catch错误处理

    • 严格的输入验证

    • 资源存在性检查


文章转载自:

http://4EQOo50F.bkqrj.cn
http://aQor4anm.bkqrj.cn
http://SIDMhd7N.bkqrj.cn
http://v8r07pie.bkqrj.cn
http://PYHAKwL6.bkqrj.cn
http://6Y34KKan.bkqrj.cn
http://Cf5MDUI9.bkqrj.cn
http://nuazSRnF.bkqrj.cn
http://c0mmgxkm.bkqrj.cn
http://MwPTKJhv.bkqrj.cn
http://2zEIQucz.bkqrj.cn
http://zsXNDjiT.bkqrj.cn
http://4phwzgac.bkqrj.cn
http://XLuLJuZS.bkqrj.cn
http://FzddpqOS.bkqrj.cn
http://PFSXQgjJ.bkqrj.cn
http://K9RuoJ8r.bkqrj.cn
http://CpJ3d23i.bkqrj.cn
http://bVcb47fG.bkqrj.cn
http://WaBB2jDR.bkqrj.cn
http://1oxfUbLE.bkqrj.cn
http://BvEuIjX1.bkqrj.cn
http://Fp68hwI5.bkqrj.cn
http://xjTKdwnR.bkqrj.cn
http://3NxvI6WO.bkqrj.cn
http://VUY319ES.bkqrj.cn
http://W15jYE10.bkqrj.cn
http://1HyvlsI3.bkqrj.cn
http://TQz0mesQ.bkqrj.cn
http://G8vaKEnn.bkqrj.cn
http://www.dtcms.com/a/381036.html

相关文章:

  • 仓颉语言与C++对比深度解析:从特性对比到语言选型及实践
  • 嵌入式 - ARM6
  • uniapp | 快速上手ThorUI组件
  • 容器使用绑定挂载
  • 智能排班系统哪个好?从L1到L4,AI排班软件选型指南
  • CentOS7.9 离线升级内核
  • 杨辉三角**
  • Android「Global / Secure / System」三大命名空间全局设置项总结
  • 【嵌入式】【科普】运动控制岗位相关职责
  • 期货盘后空开是认购期权行权?
  • 【一天一个Web3概念】Web3.0赛道分析:新一轮技术浪潮下的机遇与挑战
  • HMI界面设计:9个工业触摸屏原型案例合集与核心要点解析
  • 【一天一个Web3概念】从 Web1.0 到 Web3.0:互联网的三次演进与未来趋势
  • EMG肌电信号可视化系统【附源码】
  • 解读HRV与认知负荷
  • 打工人日报#20250912
  • 有度新版本:待办全新升级、企业互联、自带数据库...协作体验更佳!
  • 日语学习-日语知识点小记-构建基础-JLPT-N3阶段(29):文法運用第9回3+(考え方11)
  • 【Vue2 ✨】Vue2 入门之旅 · 进阶篇(八):Vuex 内部机制
  • 【LeetCode】33. 搜索旋转排序数组
  • 【代码随想录day 25】 力扣 46. 全排列
  • Java JUC并发集合详解:线程安全容器完全指南
  • 流畅的Python(二) 丰富的序列
  • DPO vs PPO,偏好优化的两条技术路径
  • clickhouse的UInt64类型(countIf() 函数返回)
  • 算法之线性基
  • GlobalBuildingAtlas 建筑物白模数据下载
  • 用pywin32连接autocad 写一个利用遗传算法从选择的闭合图形内进行最优利用率的排版 ai草稿
  • 性能测试工具JvisualVM/jconsole使用
  • 面试题:Redis要点总结(性能和使用)