100 lines
2.3 KiB
JavaScript
100 lines
2.3 KiB
JavaScript
|
|
const express = require('express')
|
|||
|
|
const cors = require('cors')
|
|||
|
|
const helmet = require('helmet')
|
|||
|
|
const morgan = require('morgan')
|
|||
|
|
const rateLimit = require('express-rate-limit')
|
|||
|
|
const xss = require('xss-clean')
|
|||
|
|
const hpp = require('hpp')
|
|||
|
|
|
|||
|
|
console.log('🔧 初始化Express应用...')
|
|||
|
|
|
|||
|
|
const { globalErrorHandler, notFound } = require('./utils/errors')
|
|||
|
|
|
|||
|
|
// 路由导入
|
|||
|
|
const authRoutes = require('./routes/auth')
|
|||
|
|
// 其他路由将在这里导入
|
|||
|
|
|
|||
|
|
const app = express()
|
|||
|
|
|
|||
|
|
console.log('✅ Express应用初始化完成')
|
|||
|
|
|
|||
|
|
// 安全中间件
|
|||
|
|
app.use(helmet())
|
|||
|
|
|
|||
|
|
// CORS配置
|
|||
|
|
app.use(cors({
|
|||
|
|
origin: process.env.NODE_ENV === 'production'
|
|||
|
|
? ['https://your-domain.com']
|
|||
|
|
: ['http://localhost:9000', 'http://localhost:3000'],
|
|||
|
|
credentials: true
|
|||
|
|
}))
|
|||
|
|
|
|||
|
|
// 请求日志
|
|||
|
|
if (process.env.NODE_ENV === 'development') {
|
|||
|
|
app.use(morgan('dev'))
|
|||
|
|
} else {
|
|||
|
|
app.use(morgan('combined'))
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 请求频率限制
|
|||
|
|
const limiter = rateLimit({
|
|||
|
|
windowMs: 15 * 60 * 1000, // 15分钟
|
|||
|
|
max: process.env.NODE_ENV === 'production' ? 100 : 1000, // 生产环境100次,开发环境1000次
|
|||
|
|
message: {
|
|||
|
|
success: false,
|
|||
|
|
code: 429,
|
|||
|
|
message: '请求过于频繁,请稍后再试',
|
|||
|
|
timestamp: new Date().toISOString()
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
app.use('/api', limiter)
|
|||
|
|
|
|||
|
|
// 请求体解析
|
|||
|
|
app.use(express.json({ limit: '10kb' }))
|
|||
|
|
app.use(express.urlencoded({ extended: true, limit: '10kb' }))
|
|||
|
|
|
|||
|
|
// 数据清洗
|
|||
|
|
app.use(xss()) // 防止XSS攻击
|
|||
|
|
app.use(hpp({ // 防止参数污染
|
|||
|
|
whitelist: [
|
|||
|
|
'page',
|
|||
|
|
'pageSize',
|
|||
|
|
'sort',
|
|||
|
|
'fields',
|
|||
|
|
'price',
|
|||
|
|
'rating',
|
|||
|
|
'distance'
|
|||
|
|
]
|
|||
|
|
}))
|
|||
|
|
|
|||
|
|
// 静态文件服务
|
|||
|
|
app.use('/uploads', express.static('uploads'))
|
|||
|
|
|
|||
|
|
// 健康检查路由
|
|||
|
|
app.get('/health', (req, res) => {
|
|||
|
|
res.status(200).json({
|
|||
|
|
status: 'OK',
|
|||
|
|
timestamp: new Date().toISOString(),
|
|||
|
|
uptime: process.uptime(),
|
|||
|
|
environment: process.env.NODE_ENV || 'development'
|
|||
|
|
})
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
// API路由
|
|||
|
|
app.use('/api/v1/auth', authRoutes)
|
|||
|
|
// 其他API路由将在这里添加
|
|||
|
|
// app.use('/api/v1/users', userRoutes)
|
|||
|
|
// app.use('/api/v1/travel', travelRoutes)
|
|||
|
|
// app.use('/api/v1/animals', animalRoutes)
|
|||
|
|
// app.use('/api/v1/flowers', flowerRoutes)
|
|||
|
|
// app.use('/api/v1/orders', orderRoutes)
|
|||
|
|
|
|||
|
|
// 404处理
|
|||
|
|
app.use('*', notFound)
|
|||
|
|
|
|||
|
|
// 全局错误处理
|
|||
|
|
app.use(globalErrorHandler)
|
|||
|
|
|
|||
|
|
console.log('✅ 应用配置完成')
|
|||
|
|
|
|||
|
|
module.exports = app
|