# 故障排除指南

## 概述

本文档提供宁夏智慧养殖监管平台常见问题的诊断和解决方案，帮助开发人员和运维人员快速定位和解决系统故障。

## 目录

- [环境相关问题](#环境相关问题)
- [数据库问题](#数据库问题)
- [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 <PID>

# 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月*

**注意**: 本文档会根据系统更新持续完善，请定期查看最新版本。