# 故障排除指南 ## 概述 本文档提供宁夏智慧养殖监管平台常见问题的诊断和解决方案,帮助开发人员和运维人员快速定位和解决系统故障。 ## 目录 - [环境相关问题](#环境相关问题) - [数据库问题](#数据库问题) - [API服务问题](#api服务问题) - [前端问题](#前端问题) - [性能问题](#性能问题) - [部署问题](#部署问题) - [日志分析](#日志分析) - [监控和诊断工具](#监控和诊断工具) ## 环境相关问题 ### Node.js 版本问题 **问题症状:** ```bash Error: The engine "node" is incompatible with this module ``` **解决方案:** ```bash # 检查当前 Node.js 版本 node --version # 要求版本: Node.js 18.0+ # 升级 Node.js nvm install 18 nvm use 18 # 或者使用官方安装包 # https://nodejs.org/ ``` ### npm 依赖安装失败 **问题症状:** ```bash npm ERR! peer dep missing npm ERR! network timeout ``` **解决方案:** ```bash # 1. 清理缓存 npm cache clean --force # 2. 删除 node_modules 和 package-lock.json rm -rf node_modules package-lock.json # 3. 重新安装 npm install # 4. 如果网络问题,使用国内镜像 npm config set registry https://registry.npmmirror.com/ # 5. 使用 yarn 替代 yarn install ``` ### 环境变量配置问题 **问题症状:** ```bash Error: Missing required environment variable ``` **解决方案:** ```bash # 1. 检查 .env 文件是否存在 ls -la .env # 2. 复制示例配置文件 cp .env.example .env # 3. 编辑配置文件 nano .env # 4. 验证环境变量 node -e "console.log(process.env.DB_HOST)" ``` ## 数据库问题 ### 数据库连接失败 **问题症状:** ``` Error: connect ECONNREFUSED 127.0.0.1:3306 SequelizeConnectionError: Access denied for user ``` **诊断步骤:** ```bash # 1. 检查 MySQL 服务状态 # macOS brew services list | grep mysql # Linux systemctl status mysql # Windows net start mysql # 2. 测试数据库连接 mysql -u root -p -h localhost -P 3306 # 3. 检查端口占用 lsof -i :3306 netstat -an | grep 3306 ``` **解决方案:** ```bash # 1. 启动 MySQL 服务 # macOS brew services start mysql # Linux sudo systemctl start mysql # Windows net start mysql # 2. 重置 MySQL 密码 mysql -u root -p ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password'; FLUSH PRIVILEGES; # 3. 创建数据库用户 CREATE USER 'nxxmdata_user'@'localhost' IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON nxxmdata.* TO 'nxxmdata_user'@'localhost'; FLUSH PRIVILEGES; ``` ### 数据库迁移失败 **问题症状:** ``` Migration failed: Table already exists Sequelize migration error ``` **解决方案:** ```bash # 1. 检查迁移状态 cd backend npm run db:status # 2. 回滚迁移 npm run db:rollback # 3. 强制重置数据库(谨慎使用) mysql -u root -p DROP DATABASE nxxmdata; CREATE DATABASE nxxmdata CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; # 4. 重新运行迁移 npm run db:migrate ``` ### 数据不一致问题 **问题症状:** ``` Foreign key constraint fails Data validation errors ``` **诊断脚本:** ```bash cd backend # 检查外键约束 node check-orphaned-foreign-keys.js # 检查数据完整性 node verify-data.js # 检查表结构 node check-table-structure.js ``` **解决方案:** ```bash # 修复孤立外键 node fix-orphaned-foreign-keys.js # 重新排序主键 node reorder-primary-keys.js # 验证修复结果 node verify-data.js ``` ## API服务问题 ### 服务启动失败 **问题症状:** ```bash Error: listen EADDRINUSE :::5350 Cannot find module ``` **解决方案:** ```bash # 1. 检查端口占用 lsof -i :5350 netstat -tulpn | grep 5350 # 2. 杀死占用进程 kill -9 # 3. 更换端口 export PORT=5351 npm run dev # 4. 检查模块依赖 npm install npm audit fix ``` ### JWT Token 问题 **问题症状:** ``` 401 Unauthorized Token expired Invalid token ``` **解决方案:** ```bash # 1. 检查 JWT 密钥配置 echo $JWT_SECRET # 2. 验证 Token 格式 node -e "console.log(require('jsonwebtoken').verify('YOUR_TOKEN', 'YOUR_SECRET'))" # 3. 重新生成密钥 node -e "console.log(require('crypto').randomBytes(64).toString('hex'))" ``` ### API 响应慢 **问题症状:** ``` Response time > 5000ms Timeout errors ``` **诊断工具:** ```bash # 1. 检查数据库查询性能 cd backend node utils/query-optimizer.js # 2. 查看性能监控 curl http://localhost:5350/api/performance/metrics # 3. 分析慢查询日志 tail -f logs/performance/database-YYYY-MM-DD.log ``` **优化方案:** ```javascript // 1. 添加数据库索引 CREATE INDEX idx_farms_status ON farms(status); CREATE INDEX idx_devices_farm_id ON devices(farm_id); // 2. 优化查询语句 const farms = await Farm.findAll({ attributes: ['id', 'name', 'status'], // 只查询需要的字段 include: [{ model: Device, attributes: ['id', 'status'] }], limit: 10, offset: (page - 1) * 10 }); // 3. 使用缓存 const Redis = require('redis'); const redis = Redis.createClient(); ``` ## 前端问题 ### 构建失败 **问题症状:** ```bash Build failed with errors Module not found Syntax error in code ``` **解决方案:** ```bash # 1. 清理构建缓存 cd admin-system/frontend rm -rf node_modules/.vite rm -rf dist # 2. 检查依赖版本 npm ls # 3. 更新依赖 npm update # 4. 重新构建 npm run build ``` ### 路由问题 **问题症状:** ``` 404 Page not found Router navigation errors ``` **解决方案:** ```javascript // 1. 检查路由配置 // router/routes.js export const routes = [ { path: '/', redirect: '/dashboard' }, { path: '/farms', component: () => import('../views/Farms.vue') } ]; // 2. 检查 Nginx 配置 // location / { // try_files $uri $uri/ /index.html; // } ``` ### API 调用失败 **问题症状:** ``` CORS errors Network errors 401/403 errors ``` **解决方案:** ```javascript // 1. 检查 API 基础 URL // config/env.js export const API_BASE_URL = process.env.VITE_API_BASE_URL || 'http://localhost:5350/api'; // 2. 添加请求拦截器 axios.interceptors.request.use( config => { const token = localStorage.getItem('token'); if (token) { config.headers.Authorization = `Bearer ${token}`; } return config; }, error => Promise.reject(error) ); // 3. 处理响应错误 axios.interceptors.response.use( response => response, error => { if (error.response?.status === 401) { // 清除 token,跳转到登录页 localStorage.removeItem('token'); router.push('/login'); } return Promise.reject(error); } ); ``` ### 地图显示问题 **问题症状:** ``` 百度地图加载失败 地图空白 坐标偏移 ``` **解决方案:** ```javascript // 1. 检查 API 密钥 console.log('百度地图 API Key:', process.env.VITE_BAIDU_MAP_API_KEY); // 2. 验证域名白名单 // 登录百度地图开放平台控制台检查 Referer 设置 // 3. 检查坐标系统 // 确保使用 BD09 坐标系 const point = new BMap.Point(106.26667, 38.46667); // 4. 处理坐标转换 // 如果数据是 WGS84 或 GCJ02,需要转换为 BD09 ``` ## 性能问题 ### 内存泄漏 **问题症状:** ``` Memory usage keeps growing Process killed by system ``` **诊断工具:** ```bash # 1. 监控内存使用 node --inspect server.js # 打开 Chrome DevTools -> Memory 选项卡 # 2. 使用 clinic.js npm install -g clinic clinic doctor -- node server.js # 3. 使用 PM2 监控 pm2 install pm2-server-monit pm2 monit ``` **解决方案:** ```javascript // 1. 清理事件监听器 process.removeAllListeners('exit'); // 2. 关闭数据库连接 await sequelize.close(); // 3. 限制并发请求 const pLimit = require('p-limit'); const limit = pLimit(10); // 4. 使用对象池 const pool = new Pool({ create: () => new ExpensiveObject(), destroy: (obj) => obj.cleanup() }); ``` ### CPU 使用率高 **问题症状:** ``` CPU usage > 80% Response time degradation ``` **诊断方法:** ```bash # 1. 查看进程状态 top -p $(pgrep node) htop # 2. 分析性能瓶颈 node --prof server.js node --prof-process isolate-*.log > processed.txt # 3. 使用火焰图 npm install -g 0x 0x server.js ``` ### 数据库查询慢 **问题症状:** ``` Query execution time > 1000ms Database connection pool exhausted ``` **优化策略:** ```sql -- 1. 添加索引 EXPLAIN SELECT * FROM farms WHERE status = 'active'; CREATE INDEX idx_farms_status ON farms(status); -- 2. 优化查询 -- 避免 SELECT * SELECT id, name, status FROM farms WHERE status = 'active'; -- 3. 使用查询缓存 SET SESSION query_cache_type = ON; ``` ## 部署问题 ### Docker 构建失败 **问题症状:** ``` Docker build failed Image size too large Container startup errors ``` **解决方案:** ```dockerfile # 1. 优化 Dockerfile FROM node:18-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm ci --only=production # 2. 使用多阶段构建 FROM node:18-alpine AS runner COPY --from=builder /app/node_modules ./node_modules COPY . . EXPOSE 5350 CMD ["npm", "start"] # 3. 添加 .dockerignore node_modules .git .env logs/* ``` ### Nginx 配置问题 **问题症状:** ``` 502 Bad Gateway 404 for static files CORS errors ``` **解决方案:** ```nginx server { listen 80; server_name localhost; # 解决 CORS 问题 add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods "GET, POST, OPTIONS"; add_header Access-Control-Allow-Headers "Content-Type, Authorization"; # 前端路由 location / { root /usr/share/nginx/html; try_files $uri $uri/ /index.html; } # API 代理 location /api { proxy_pass http://backend:5350; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 超时设置 proxy_connect_timeout 30s; proxy_send_timeout 30s; proxy_read_timeout 30s; } } ``` ### SSL 证书问题 **问题症状:** ``` Certificate expired SSL handshake failed Mixed content warnings ``` **解决方案:** ```bash # 1. 使用 Let's Encrypt certbot --nginx -d yourdomain.com # 2. 检查证书状态 openssl x509 -in /path/to/cert.pem -text -noout # 3. 自动续期 echo "0 12 * * * /usr/bin/certbot renew --quiet" | crontab - # 4. 强制 HTTPS return 301 https://$server_name$request_uri; ``` ## 日志分析 ### 后端日志 **日志位置:** ```bash backend/logs/ ├── app.log # 应用日志 ├── error.log # 错误日志 ├── access.log # 访问日志 └── performance/ # 性能监控日志 ├── system-YYYY-MM-DD.log └── database-YYYY-MM-DD.log ``` **常用命令:** ```bash # 实时查看日志 tail -f backend/logs/app.log # 搜索错误 grep -i error backend/logs/*.log # 分析访问模式 awk '{print $1}' backend/logs/access.log | sort | uniq -c | sort -nr # 查看特定时间段日志 sed -n '/2025-01-18 10:00/,/2025-01-18 11:00/p' backend/logs/app.log ``` ### 前端日志 **浏览器控制台:** ```javascript // 1. 查看网络请求 // Network 标签页 -> 筛选 XHR/Fetch // 2. 查看 JavaScript 错误 // Console 标签页 -> 筛选 Errors // 3. 查看性能 // Performance 标签页 -> 录制并分析 // 4. 查看内存使用 // Memory 标签页 -> Heap snapshot ``` ## 监控和诊断工具 ### 系统监控 ```bash # 1. 系统资源监控 htop iostat -x 1 vmstat 1 # 2. 磁盘使用 df -h du -sh /path/to/project # 3. 网络连接 netstat -tulpn ss -tulpn ``` ### 应用监控 ```bash # 1. PM2 监控 pm2 monit pm2 logs pm2 show app-name # 2. Node.js 性能分析 node --inspect server.js # 访问 chrome://inspect # 3. 数据库监控 SHOW PROCESSLIST; SHOW STATUS LIKE 'Slow_queries'; ``` ### 自定义监控脚本 ```bash #!/bin/bash # health-check.sh # 检查服务状态 curl -f http://localhost:5350/api/health || echo "API 服务异常" # 检查数据库连接 mysql -u root -p -e "SELECT 1" > /dev/null 2>&1 || echo "数据库连接失败" # 检查磁盘空间 df -h | awk '$5 > 80 {print "磁盘使用率过高: " $0}' # 检查内存使用 free | awk 'NR==2{printf "内存使用率: %.2f%%\n", $3*100/$2}' ``` ## 紧急响应流程 ### 服务不可用 **立即响应 (5分钟内):** ```bash # 1. 检查服务状态 pm2 status systemctl status nginx # 2. 重启服务 pm2 restart all systemctl restart nginx # 3. 检查日志 tail -f logs/error.log ``` **深入分析 (30分钟内):** ```bash # 1. 检查系统资源 top df -h free -h # 2. 分析错误日志 grep -i error logs/*.log | tail -20 # 3. 数据库健康检查 mysql -e "SHOW PROCESSLIST;" ``` ### 数据库异常 **紧急处理:** ```bash # 1. 检查数据库状态 systemctl status mysql # 2. 查看错误日志 tail -f /var/log/mysql/error.log # 3. 重启数据库服务 systemctl restart mysql # 4. 检查数据完整性 mysqlcheck -u root -p --all-databases ``` ### 安全事件 **响应步骤:** ```bash # 1. 隔离受影响的服务 pm2 stop suspicious-process # 2. 检查访问日志 grep -E "(404|500)" logs/access.log | tail -50 # 3. 更新密码和密钥 # 重新生成 JWT 密钥 # 强制所有用户重新登录 # 4. 通知相关人员 echo "安全事件发生,请立即检查系统" | mail -s "紧急: 安全告警" admin@company.com ``` ## 联系支持 ### 获取帮助的渠道 1. **技术支持邮箱**: support@nxxmdata.com 2. **紧急联系电话**: 400-xxx-xxxx 3. **在线文档**: https://docs.nxxmdata.com 4. **GitHub Issues**: https://github.com/your-org/nxxmdata/issues ### 报告问题时请提供 1. **错误描述**: 详细的错误信息和复现步骤 2. **环境信息**: 操作系统、Node.js版本、浏览器版本 3. **日志文件**: 相关的错误日志 4. **配置信息**: 去敏感化的配置文件 5. **系统状态**: CPU、内存、磁盘使用情况 --- *最后更新: 2025年1月* **注意**: 本文档会根据系统更新持续完善,请定期查看最新版本。