后端版本服务器部署成功
This commit is contained in:
@@ -12,13 +12,23 @@ console.log('🔧 初始化Express应用...');
|
||||
|
||||
const { globalErrorHandler, notFound } = require('./utils/errors');
|
||||
|
||||
// 路由导入
|
||||
const authRoutes = require('./routes/auth');
|
||||
const userRoutes = require('./routes/user');
|
||||
const travelRoutes = require('./routes/travel');
|
||||
const animalRoutes = require('./routes/animal');
|
||||
const orderRoutes = require('./routes/order');
|
||||
const adminRoutes = require('./routes/admin'); // 新增管理员路由
|
||||
// 检查是否为无数据库模式
|
||||
const NO_DB_MODE = process.env.NO_DB_MODE === 'true';
|
||||
|
||||
let authRoutes, userRoutes, travelRoutes, animalRoutes, orderRoutes, adminRoutes;
|
||||
|
||||
// 路由导入 - 根据是否为无数据库模式决定是否导入实际路由
|
||||
if (NO_DB_MODE) {
|
||||
console.log('⚠️ 无数据库模式:将使用模拟路由');
|
||||
} else {
|
||||
// 路由导入
|
||||
authRoutes = require('./routes/auth');
|
||||
userRoutes = require('./routes/user');
|
||||
travelRoutes = require('./routes/travel');
|
||||
animalRoutes = require('./routes/animal');
|
||||
orderRoutes = require('./routes/order');
|
||||
adminRoutes = require('./routes/admin'); // 新增管理员路由
|
||||
}
|
||||
|
||||
const app = express();
|
||||
|
||||
@@ -88,7 +98,8 @@ app.get('/health', (req, res) => {
|
||||
status: 'OK',
|
||||
timestamp: new Date().toISOString(),
|
||||
uptime: process.uptime(),
|
||||
environment: process.env.NODE_ENV || 'development'
|
||||
environment: process.env.NODE_ENV || 'development',
|
||||
noDbMode: NO_DB_MODE
|
||||
});
|
||||
});
|
||||
|
||||
@@ -103,20 +114,85 @@ app.get('/system-stats', (req, res) => {
|
||||
uptime: process.uptime(),
|
||||
cpuCount: require('os').cpus().length,
|
||||
platform: process.platform,
|
||||
architecture: process.arch
|
||||
architecture: process.arch,
|
||||
noDbMode: NO_DB_MODE
|
||||
};
|
||||
|
||||
res.status(200).json(stats);
|
||||
});
|
||||
|
||||
// API路由
|
||||
app.use('/api/v1/auth', authRoutes);
|
||||
app.use('/api/v1/users', userRoutes);
|
||||
app.use('/api/v1/travel', travelRoutes);
|
||||
app.use('/api/v1/animals', animalRoutes);
|
||||
app.use('/api/v1/orders', orderRoutes);
|
||||
// 管理员路由
|
||||
app.use('/api/v1/admin', adminRoutes);
|
||||
// 无数据库模式下的模拟路由
|
||||
if (NO_DB_MODE) {
|
||||
// 认证路由
|
||||
app.use('/api/v1/auth', (req, res) => {
|
||||
if (req.method === 'POST' && req.path === '/login') {
|
||||
// 模拟登录响应
|
||||
res.status(200).json({
|
||||
success: true,
|
||||
message: '模拟登录成功',
|
||||
data: {
|
||||
token: 'mock-jwt-token',
|
||||
user: {
|
||||
id: 1,
|
||||
username: 'mockuser',
|
||||
email: 'mock@example.com',
|
||||
role: 'user'
|
||||
}
|
||||
}
|
||||
});
|
||||
} else {
|
||||
res.status(503).json({
|
||||
success: false,
|
||||
message: '当前为无数据库模式,该功能不可用'
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// 其他路由的通用响应
|
||||
app.use('/api/v1/users', (req, res) => {
|
||||
res.status(503).json({
|
||||
success: false,
|
||||
message: '当前为无数据库模式,用户管理功能不可用'
|
||||
});
|
||||
});
|
||||
|
||||
app.use('/api/v1/travel', (req, res) => {
|
||||
res.status(503).json({
|
||||
success: false,
|
||||
message: '当前为无数据库模式,旅行相关功能不可用'
|
||||
});
|
||||
});
|
||||
|
||||
app.use('/api/v1/animals', (req, res) => {
|
||||
res.status(503).json({
|
||||
success: false,
|
||||
message: '当前为无数据库模式,动物相关功能不可用'
|
||||
});
|
||||
});
|
||||
|
||||
app.use('/api/v1/orders', (req, res) => {
|
||||
res.status(503).json({
|
||||
success: false,
|
||||
message: '当前为无数据库模式,订单相关功能不可用'
|
||||
});
|
||||
});
|
||||
|
||||
app.use('/api/v1/admin', (req, res) => {
|
||||
res.status(503).json({
|
||||
success: false,
|
||||
message: '当前为无数据库模式,管理员功能不可用'
|
||||
});
|
||||
});
|
||||
} else {
|
||||
// API路由
|
||||
app.use('/api/v1/auth', authRoutes);
|
||||
app.use('/api/v1/users', userRoutes);
|
||||
app.use('/api/v1/travel', travelRoutes);
|
||||
app.use('/api/v1/animals', animalRoutes);
|
||||
app.use('/api/v1/orders', orderRoutes);
|
||||
// 管理员路由
|
||||
app.use('/api/v1/admin', adminRoutes);
|
||||
}
|
||||
|
||||
// 404处理
|
||||
app.use('*', notFound);
|
||||
|
||||
@@ -1,16 +1,9 @@
|
||||
const mysql = require('mysql2/promise');
|
||||
const config = require('../../config/env');
|
||||
|
||||
// 数据库配置
|
||||
// 数据库配置 - 使用env.js中的mysql配置
|
||||
const dbConfig = {
|
||||
host: process.env.DB_HOST || 'nj-cdb-3pwh2kz1.sql.tencentcdb.com',
|
||||
port: process.env.DB_PORT || 20784,
|
||||
user: process.env.DB_USER || 'jiebanke',
|
||||
password: process.env.DB_PASSWORD || 'aiot741$12346',
|
||||
database: process.env.DB_NAME || 'jbkdata',
|
||||
connectionLimit: process.env.DB_CONNECTION_LIMIT || 10,
|
||||
charset: process.env.DB_CHARSET || 'utf8mb4',
|
||||
timezone: process.env.DB_TIMEZONE || '+08:00',
|
||||
...config.mysql,
|
||||
// 连接池配置
|
||||
waitForConnections: true,
|
||||
queueLimit: 0,
|
||||
@@ -30,6 +23,22 @@ async function testConnection() {
|
||||
return true;
|
||||
} catch (error) {
|
||||
console.error('❌ MySQL数据库连接失败:', error.message);
|
||||
console.error('🔍 错误代码:', error.code);
|
||||
console.error('📌 数据库配置:', {
|
||||
host: dbConfig.host,
|
||||
port: dbConfig.port,
|
||||
database: dbConfig.database,
|
||||
user: dbConfig.user
|
||||
});
|
||||
|
||||
if (error.code === 'ECONNREFUSED') {
|
||||
console.error('💡 可能原因: MySQL服务器未启动或网络不可达');
|
||||
} else if (error.code === 'ER_ACCESS_DENIED_ERROR') {
|
||||
console.error('💡 可能原因: 用户名或密码错误');
|
||||
} else if (error.code === 'ER_BAD_DB_ERROR') {
|
||||
console.error('💡 可能原因: 数据库不存在');
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
require('dotenv').config()
|
||||
const app = require('./app')
|
||||
const { testConnection } = require('./config/database')
|
||||
const redisConfig = require('./config/redis')
|
||||
const rabbitMQConfig = require('./config/rabbitmq')
|
||||
const { testConnection, pool } = require('./config/database')
|
||||
|
||||
const PORT = process.env.PORT || 3200
|
||||
const HOST = process.env.HOST || '0.0.0.0'
|
||||
@@ -20,8 +18,9 @@ console.log(`🔹 NODE_ENV: ${process.env.NODE_ENV || 'development'}`)
|
||||
console.log(`🔹 PORT: ${PORT}`)
|
||||
console.log(`🔹 HOST: ${HOST}`)
|
||||
console.log(`🔹 DATABASE_URL: ${process.env.DATABASE_URL ? '已配置' : '未配置'}`)
|
||||
console.log(`🔹 REDIS_URL: ${process.env.REDIS_URL ? '已配置' : '未配置'}`)
|
||||
console.log(`🔹 RABBITMQ_URL: ${process.env.RABBITMQ_URL ? '已配置' : '未配置'}\n`)
|
||||
console.log(`🔹 使用生产环境MySQL数据库: 是`)
|
||||
console.log(`🔹 使用Redis缓存: 否`)
|
||||
console.log(`🔹 使用RabbitMQ消息队列: 否\n`)
|
||||
|
||||
// 优雅关闭处理
|
||||
process.on('uncaughtException', (err) => {
|
||||
@@ -51,41 +50,20 @@ const startServer = async () => {
|
||||
|
||||
console.log('🔍 测试数据库连接...')
|
||||
// 测试数据库连接
|
||||
await testConnection()
|
||||
const isConnected = await testConnection()
|
||||
if (!isConnected) {
|
||||
console.error('❌ 数据库连接测试失败,无法启动服务器')
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
console.log('✅ 数据库连接测试成功')
|
||||
console.log('📌 数据库连接池配置:', {
|
||||
host: process.env.DB_HOST,
|
||||
port: process.env.DB_PORT,
|
||||
database: process.env.DB_NAME,
|
||||
user: process.env.DB_USER
|
||||
host: pool.config.host,
|
||||
port: pool.config.port,
|
||||
database: pool.config.database,
|
||||
user: pool.config.user
|
||||
})
|
||||
|
||||
// 连接Redis(可选)
|
||||
try {
|
||||
console.log('\n🔍 初始化Redis连接...')
|
||||
console.log(`📌 Redis配置: ${process.env.REDIS_URL || '使用默认配置'}`)
|
||||
await redisConfig.connect()
|
||||
console.log('✅ Redis连接成功')
|
||||
const info = await redisConfig.getInfo()
|
||||
console.log('📌 Redis服务器信息:', info.server)
|
||||
console.log('📌 Redis内存信息:', info.memory)
|
||||
} catch (error) {
|
||||
console.warn('⚠️ Redis连接失败,继续以无缓存模式运行')
|
||||
console.warn(`🔹 错误详情: ${error.message}`)
|
||||
}
|
||||
|
||||
// 连接RabbitMQ(可选)
|
||||
try {
|
||||
console.log('\n🔍 初始化RabbitMQ连接...')
|
||||
console.log(`📌 RabbitMQ配置: ${process.env.RABBITMQ_URL || '使用默认配置'}`)
|
||||
await rabbitMQConfig.connect()
|
||||
console.log('✅ RabbitMQ连接成功')
|
||||
const connInfo = rabbitMQConfig.getConnectionInfo()
|
||||
console.log('📌 RabbitMQ连接信息:', connInfo)
|
||||
} catch (error) {
|
||||
console.warn('⚠️ RabbitMQ连接失败,继续以无消息队列模式运行')
|
||||
console.warn(`🔹 错误详情: ${error.message}`)
|
||||
}
|
||||
console.log('🔄 所有数据库连接已统一使用database.js配置')
|
||||
|
||||
// 启动HTTP服务器
|
||||
console.log('\n🔍 启动HTTP服务器...')
|
||||
@@ -96,8 +74,8 @@ const startServer = async () => {
|
||||
console.log(`📊 环境: ${process.env.NODE_ENV || 'development'}`)
|
||||
console.log(`⏰ 启动时间: ${new Date().toLocaleString()}`)
|
||||
console.log('💾 数据库: MySQL')
|
||||
console.log(`🔴 Redis: ${redisConfig.isConnected ? '已连接' : '未连接'}`)
|
||||
console.log(`🐰 RabbitMQ: ${rabbitMQConfig.isConnected ? '已连接' : '未连接'}`)
|
||||
console.log('🔴 Redis: 未使用')
|
||||
console.log('🐰 RabbitMQ: 未使用')
|
||||
console.log('========================================\n')
|
||||
})
|
||||
|
||||
@@ -122,20 +100,6 @@ const startServer = async () => {
|
||||
await new Promise((resolve) => server.close(resolve))
|
||||
console.log('✅ HTTP服务器已关闭')
|
||||
|
||||
// 关闭Redis连接
|
||||
if (redisConfig.isConnected()) {
|
||||
console.log('🔐 关闭Redis连接...')
|
||||
await redisConfig.disconnect()
|
||||
console.log('✅ Redis连接已关闭')
|
||||
}
|
||||
|
||||
// 关闭RabbitMQ连接
|
||||
if (rabbitMQConfig.isConnected) {
|
||||
console.log('🔐 关闭RabbitMQ连接...')
|
||||
await rabbitMQConfig.close()
|
||||
console.log('✅ RabbitMQ连接已关闭')
|
||||
}
|
||||
|
||||
console.log('\n========================================')
|
||||
console.log('👋 服务器已完全关闭')
|
||||
console.log('========================================')
|
||||
|
||||
Reference in New Issue
Block a user