SFT/mock-server/index.js

73 lines
3.4 KiB
JavaScript

// mock-server 入口:装配全部业务路由,启动一个独立 Express 进程模拟真实后端。
// 启动方式:npm run mock(默认端口 8888,可通过环境变量 MOCK_PORT 覆盖)。
import express from 'express'
import cors from 'cors'
import cookieParser from 'cookie-parser'
import authRouter from './routes/auth.js'
import organizationRouter from './routes/organization.js'
import userRouter from './routes/user.js'
import roleRouter from './routes/role.js'
import permissionRouter from './routes/permission.js'
import baseConfigRouter from './routes/baseConfig.js'
import customerRouter from './routes/customer.js'
import walletRouter from './routes/wallet.js'
import personalOpenMobileRouter from './routes/personalOpenMobile.js'
import faceRecognizeRouter from './routes/faceRecognize.js'
import uploadFileRouter from './routes/uploadFile.js'
import creditRouter from './routes/credit.js'
import merchantRouter from './routes/merchant.js'
import invoiceRouter from './routes/invoice.js'
import paymentRouter from './routes/payment.js'
import orderRouter from './routes/order.js'
const app = express()
// 允许携带 Cookie 跨域(前端 axios withCredentials: true 依赖此配置)
app.use(cors({ origin: true, credentials: true }))
app.use(cookieParser())
app.use(express.json({ limit: '10mb' }))
// 个人开户移动端H5确认页(fryl_h5)专用的匿名接口(不经过任何 requireAuth 中间件),必须挂载在
// 所有以 app.use('/api', xxxRouter) 形式挂载、且内部用 router.use(requireAuth)(不带路径)拦截
// 鉴权的 router(customerRouter/walletRouter/userRouter/roleRouter/baseConfigRouter/...)**之前**:
// 这种写法拦截的是"该 router 匹配到的任意路径"而不仅是它们自己定义的路由,只要挂载顺序在它们
// 之后,任何 /api/* 匿名请求都会先被拦截返回401(已实测复现,详见设计文档"mock-server 配套修复
// 与改造"章节)。挂载在带具体子路径前缀(如 /api/auth、/api/organization)的 router 之后是安全
// 的,因为 Express 只会在路径前缀匹配时才进入该 router。uploadFileRouter(2026-08-06 新增)
// 同时被管理后台(已登录)与 fryl_h5(匿名)复用,原因与 faceRecognizeRouter 一致,同样必须放
// 在这个位置,不能挂到 customer.js。
app.use('/api', personalOpenMobileRouter)
app.use('/api', faceRecognizeRouter)
app.use('/api', uploadFileRouter)
app.use('/api/auth', authRouter)
app.use('/api/organization', organizationRouter)
app.use('/api', userRouter)
app.use('/api', roleRouter)
app.use('/api/permission', permissionRouter)
app.use('/api', baseConfigRouter)
app.use('/api', customerRouter)
app.use('/api', walletRouter)
app.use('/api/credit-apply', creditRouter)
app.use('/api/merchant', merchantRouter)
app.use('/api', invoiceRouter)
app.use('/api', paymentRouter)
app.use('/api', orderRouter)
app.use((req, res) => {
res.status(404).json({ code: 404, message: `接口不存在: ${req.method} ${req.originalUrl}`, data: null })
})
// eslint-disable-next-line no-unused-vars
app.use((err, req, res, next) => {
console.error('[mock-server] 未捕获异常:', err)
res.status(500).json({ code: 500, message: err?.message || '服务器内部错误', data: null })
})
const PORT = process.env.MOCK_PORT || 8888
app.listen(PORT, () => {
console.log(`[mock-server] 已启动,监听端口 ${PORT}`)
console.log('[mock-server] 测试账号: admin / Admin@123')
})