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

制作网站的公司还能赚钱吗如何改wordpress文章模板

制作网站的公司还能赚钱吗,如何改wordpress文章模板,免费大数据网站,建设网络强国要有什么ExpressMySQL后台开发实战:从模块化到错误处理的全链路解析 摘要:本文将以Node.jsExpress框架为基础,结合MySQL数据库实战,深度剖析后台系统中数据库模块化设计、安全查询、错误处理等核心开发要点。 一、项目环境与技术栈 ├─…

Express+MySQL后台开发实战:从模块化到错误处理的全链路解析

摘要:本文将以Node.js+Express框架为基础,结合MySQL数据库实战,深度剖析后台系统中数据库模块化设计、安全查询、错误处理等核心开发要点。

一、项目环境与技术栈

├── src/
│   ├── db/             # 数据库模块
│   │   └── querys/     # 数据模型
│   │   └── index.js    # 数据库连接池
│   ├── routes/         # 路由层
│   └── app.js          # 主入口
└── .env                # 环境配置

实现后台实战开发必须用到的依赖库:
在这里插入图片描述

二、核心实现解析

1. 安全连接配置

.env环境配置示例:

SQL_PORT=3306
SQL_HOST='localhost'
SQL_USER='root'
SQL_PASSWORD='your_password'
SQL_DATABASE='back_system'
REDIS_HOST='localhost'
REDIS_PORT=6379
REDIS_PASSWORD='your_redis_password'

连接池初始化逻辑:

const mysql = require('mysql2/promise');const pool = mysql.createPool({host: process.env.SQL_HOST,user: process.env.SQL_USER,password: process.env.SQL_PASSWORD,database: process.env.SQL_DATABASE,waitForConnections: true,connectionLimit: 10,queueLimit: 0
});

2. 模块化数据层

用户模型封装示例:

class UserModel {// 通用查询方法async find(params = {}) {try {let sql = 'SELECT * FROM users';const whereClauses = [];const values = [];// 动态构建WHERE条件Object.keys(params).forEach(key => {whereClauses.push(`${key} = ?`);values.push(params[key]);});if (whereClauses.length) {sql += ` WHERE ${whereClauses.join(' AND ')}`;}const [rows] = await this.pool.execute(sql, values);return rows;} catch (error) {this.handleError(error, '查询操作');return false;}}// 统一错误处理handleError(error, operation) {console.error(`[DB Error] ${operation}:`, {code: error.code,sqlState: error.sqlState,sqlMessage: error.sqlMessage});}
}

3. 路由层最佳实践

// 用户删除操作
router.post('/delete/:account', async (req, res) => {try {const { account } = req.params;// 参数校验if (!account) {return res.status(400).json({ code: 400,message: '缺少必要参数' });}const result = await userModel.deleteById(account);if (result > 0) {res.json({code: 200,data: { affectedRows: result },message: '删除成功'});} else {res.status(404).json({code: 404,message: '用户不存在'});}} catch (error) {res.status(500).json({code: 500,message: '服务器内部错误',debug: process.env.NODE_ENV === 'development' ? error.stack : undefined});}
});

三、关键技术解析

1. 安全防护措施

(1) 参数化查询:所有SQL语句使用?占位符
await this.pool.execute('DELETE FROM users WHERE account = ?', [account])
(2) 输入验证:路由层校验必要参数
router.post('/delete/:id', async function (req, res) {
// 验证参数if(!req.params.id){return res.send({code: 500,message: '缺少参数'})}const { id } = req.paramsconst user = await userModel.deleteById(id)...后续代码逻辑
});
(3) 错误信息脱敏:生产环境隐藏堆栈详情
// 错误处理中间件
app.use((err, req, res, next) => {console.error(err.stack); // 服务器端仍然记录完整错误const response = {code: err.status || 500,message: err.message || '内部服务器错误'};// 开发环境返回完整错误信息if (process.env.NODE_ENV === 'development') {response.stack = err.stack;response.details = err;}res.status(response.code).json(response);
});

以删除用户为例:

// 删除用户
router.post('/delete/:id', async function (req, res) {try {if(!req.params.id) {throw { code: 400, message: '缺少参数' };}if(req.user.identity !== 0) {throw { code: 403, message: '权限不足' };}const { id } = req.params;const result = await userModel.deleteById(id);if (!result) {throw { code: 500, message: '删除失败' };}res.json({ code: 200,data: result,message: '删除成功' });} catch (error) {// 这里会进入上面定义的错误处理中间件next(error); }
});

2. 多级错误处理

// 模型层记录原始错误
handleError(error) {console.error('[Database Error]', {code: error.code,sql: error.sql,stack: error.stack});
}// 路由层返回友好提示
res.status(500).json({code: 500,message: '请求处理失败',requestId: req.requestId // 添加请求ID便于追踪
});

3. 性能优化方案

(1) 连接池配置:
const pool = mysql.createPool({// ...connectionLimit: 10,       // 最大连接数queueLimit: 0,             // 无限制排队acquireTimeout: 30000      // 30秒获取超时
});
(2) 索引优化:为account字段添加唯一索引
ALTER TABLE users ADD UNIQUE INDEX idx_account (account);

四、扩展思考

1. 事务处理:多操作原子性保证

const conn = await pool.getConnection();
try {await conn.beginTransaction();// 执行多个操作await conn.query('...');await conn.query('...');await conn.commit();
} catch (error) {await conn.rollback();throw error;
} finally {conn.release();
}

2. 数据缓存:结合Redis提升查询性能

const { createClient } = require('redis');
// 创建Redis客户端(添加到现有数据库配置)
const redisClient = createClient({socket: {host: process.env.REDIS_HOST,port: process.env.REDIS_PORT},password: process.env.REDIS_PASSWORD
});
// 初始化Redis连接
(async () => {try {await redisClient.connect();console.log('Redis connected successfully');} catch (err) {console.error('Redis connection failed:', err);}
})();
// 导出Redis客户端(保留原有MySQL导出)
module.exports = { pool, redisClient };

操作数据库函数内:

// 生成唯一缓存键
const cacheKey = `user:${JSON.stringify(params)}`;
// 尝试获取缓存
const cachedData = await redisClient.get(cacheKey);
if (cachedData) {return JSON.parse(cachedData);
}
// 无缓存则查询数据库
const [rows] = await this.pool.execute(/* 原有SQL逻辑 */);
// 设置缓存(1小时过期)
await redisClient.setEx(cacheKey, 3600, JSON.stringify(rows));
return rows;

五、总结

通过模块化设计,我们将数据库操作封装为独立服务层,配合:

  • 参数化查询保障安全
  • 多级错误处理提升健壮性
  • 连接池优化提升性能

完整项目代码已开源在:Gitee链接

http://www.dtcms.com/wzjs/562830.html

相关文章:

  • 如何创作网站wordpress08
  • 有哪些外贸公司网站做的比较好服务平台收件箱
  • 成都公园城市建设局网站wordpress 批量换
  • 天安节能科技园公司做网站做网站做网站
  • 三原县城乡建设局网站金华网站建设报价
  • 网站后端用什么语言vs2013 网站开发
  • 营销型网站建站步骤是什么意思建设在线教育网站
  • 各种类型网站建设html5 单页网站
  • 各地城乡建设网站更新营销策划书范文大全
  • logo网站推介网站开发用哪个软件
  • 网站建设配置文件无法粘贴贵阳网站优化
  • 有没有专门搞网站上线的公司陆丰网站
  • 建设小说网站风险分析自学装修设计从哪里入手
  • 小说阅读网站建设建设银行网站怎么开通手机通知
  • 公司网站标题优化华为游戏中心
  • 网站怎么做内容黄冈seo推广优势
  • 龙岗网站建设过程网站登录密码忘记了
  • 深圳营销型网站哪家好wordpress后台502
  • 站长工具平台专业网站设计模板
  • 杭州网站开发建设国外网站模板下载
  • 波哥昆明网站建设开发平台搭建
  • 龙岩网站建设方案优化做调查赚钱的网站有哪些
  • 网站设计与开发期末考试题深圳福田网站建设公司哪家好
  • 数据库检索网站建设建瓯网站制作
  • 粉末涂料做网站有用吗wordpress 会员聊天
  • 做家教网站怎么样北京怎么做网站推广
  • 建设工程东莞网站建设技术支持济南的网站建设
  • 网站开发还需要兼ie吗网站 编程 语言
  • 东莞技术支持网站建设专家忻州网站建设哪家好
  • dedecms妇科医院wap网站模板 v1.0广州城乡建设局