refactor!: 迁移到 Fastify 5 并统一 DMS snake_case 契约
结构(fastify-cli 官方布局):
- plugins/ 用 fastify-plugin 装饰共享资源(db/mysql/mongoose),生命周期随实例
- routes/ 目录即 URL 前缀,autoload 注册;DMS 用 autohooks.js 做 onRequest 鉴权
- 新增 schemas/(zod 契约)、clients/(外部系统)、lib/(纯工具)、db/schema/、models/
- 跨目录引用改用 #src/* 子路径别名
契约(破坏性):
- DMS 接口的请求体/查询参数/响应字段统一 snake_case,与 MySQL 列名一致,
派生字段(can_edit_project、editable_stages、project_manager_name 等)同样下划线
- logs(Mongo) 与微信接口保持 camelCase
- center-dms 需与本次同批次发布
其他:
- 错误处理:4xx 记 warn(不打堆栈),5xx 记 error;统一错误响应结构
- 性能:日志索引、MySQL 连接池可配、gzip 压缩
- 运维:/health/ready 探活、x-request-id 回传、SIGTERM 优雅退出
- 依赖升级(axios/mysql2/mongoose/zod/fastify 等),生产漏洞 7 → 0
正在显示
This source diff could not be displayed because it is too large.
You can
view the blob
instead.
| { | { | ||
| "name": "ezijing-node-server", | "name": "ezijing-node-server", | ||
| "version": "2.0.0", | "version": "2.0.0", | ||
| "description": "ezijing-node-server - Modern Node.js API server", | "description": "ezijing-node-server - Fastify API server", | ||
| "private": true, | |||
| "type": "module", | "type": "module", | ||
| "main": "src/index.js", | "repository": { | ||
| "type": "git", | |||
| "url": "http://172.16.3.193/ezijing-web/ezijing-node-server.git" | |||
| }, | |||
| "imports": { | |||
| "#src/*": "./src/*" | |||
| }, | |||
| "scripts": { | "scripts": { | ||
| "start": "node src/index.js", | "start": "node src/index.js", | ||
| "dev": "cross-env NODE_ENV=development node --watch src/index.js", | "dev": "cross-env NODE_ENV=development node --watch src/index.js", | ||
| "db:generate": "drizzle-kit generate", | "db:generate": "drizzle-kit generate", | ||
| "lint": "eslint src/", | "lint": "eslint .", | ||
| "lint:fix": "eslint --fix src/", | "lint:fix": "eslint --fix .", | ||
| "deploy": "cross-env NODE_ENV=production SERVER_PORT=5101 DOTENV_CONFIG_PATH=.env.prod pm2 start src/index.js -n ezijing-node-server", | "deploy": "NODE_ENV=production DOTENV_CONFIG_PATH=.env.prod pm2 start src/index.js -n ezijing-node-server --kill-timeout 10000", | ||
| "reload": "pm2 reload ezijing-node-server" | "reload": "pm2 reload ezijing-node-server", | ||
| "test": "node --test", | |||
| "db:migrate": "drizzle-kit migrate", | |||
| "db:status": "node scripts/db-status.mjs", | |||
| "check": "npm run lint && npm test", | |||
| "test:watch": "node --test --watch" | |||
| }, | }, | ||
| "author": "King", | "author": "King", | ||
| "license": "ISC", | "license": "ISC", | ||
| "engines": { | "engines": { | ||
| "node": ">=18.0.0" | "node": ">=20.19.0" | ||
| }, | }, | ||
| "devDependencies": { | "devDependencies": { | ||
| "cross-env": "^10.1.0", | |||
| "drizzle-kit": "^0.31.10", | "drizzle-kit": "^0.31.10", | ||
| "eslint": "^9.15.0", | "eslint": "^10.10.0", | ||
| "globals": "^15.12.0", | "globals": "^17.12.0" | ||
| "pino-pretty": "^13.1.3" | |||
| }, | }, | ||
| "dependencies": { | "dependencies": { | ||
| "@fastify/autoload": "^6.5.0", | |||
| "@fastify/compress": "^9.2.0", | |||
| "@fastify/cors": "^11.3.0", | |||
| "@fastify/formbody": "^9.0.0", | |||
| "@fastify/http-proxy": "^11.6.2", | |||
| "@fastify/swagger": "^9.8.1", | |||
| "@fastify/swagger-ui": "^6.1.1", | |||
| "ali-oss": "^6.23.0", | "ali-oss": "^6.23.0", | ||
| "axios": "^1.15.2", | "axios": "^1.20.0", | ||
| "cors": "^2.8.5", | |||
| "cross-env": "^7.0.3", | |||
| "dayjs": "^1.11.19", | "dayjs": "^1.11.19", | ||
| "dotenv": "^16.4.5", | "dotenv": "^17.4.2", | ||
| "drizzle-orm": "^0.45.2", | "drizzle-orm": "^0.45.2", | ||
| "express": "^5.2.1", | "fastify": "^5.12.3", | ||
| "express-http-proxy": "^2.1.2", | "fastify-plugin": "^6.0.0", | ||
| "mongoose": "^8.23.1", | "fastify-type-provider-zod": "^7.0.0", | ||
| "lru-cache": "^11.5.2", | |||
| "mongoose": "^9.9.5", | |||
| "mysql2": "^3.20.0", | "mysql2": "^3.20.0", | ||
| "pino": "^10.3.1", | "pino": "^10.3.1", | ||
| "pino-http": "^11.0.0", | |||
| "ua-parser-js": "^2.0.6", | "ua-parser-js": "^2.0.6", | ||
| "zod": "^4.4.3" | "zod": "^4.4.3" | ||
| } | } | ||
| ... | ... |
差异被折叠。
src/lib/cached-fetch.js
0 → 100644
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
src/lib/validate.js
deleted
100644 → 0
差异被折叠。
src/middleware/error.js
deleted
100644 → 0
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
src/plugins/compress.js
0 → 100644
差异被折叠。
src/plugins/cors.js
0 → 100644
差异被折叠。
src/plugins/formbody.js
0 → 100644
差异被折叠。
src/plugins/mongo.js
0 → 100644
差异被折叠。
src/plugins/mysql.js
0 → 100644
差异被折叠。
src/plugins/request-id.js
0 → 100644
差异被折叠。
src/plugins/swagger.js
0 → 100644
差异被折叠。
src/plugins/usercenter-proxy.js
0 → 100644
差异被折叠。
src/plugins/zod.js
0 → 100644
差异被折叠。
src/routes/api/dms/auth.js
0 → 100644
差异被折叠。
src/routes/api/dms/autohooks.js
0 → 100644
差异被折叠。
src/routes/api/dms/cases.js
0 → 100644
差异被折叠。
src/routes/api/dms/products.js
0 → 100644
差异被折叠。
src/routes/api/dms/projects.js
0 → 100644
差异被折叠。
src/routes/root.js
0 → 100644
差异被折叠。
src/routes/wechat.js
0 → 100644
差异被折叠。
src/routes/wx-chart.js
0 → 100644
差异被折叠。
src/schemas/dms/cases.js
0 → 100644
差异被折叠。
src/schemas/dms/common.js
0 → 100644
差异被折叠。
src/schemas/dms/products.js
0 → 100644
差异被折叠。
src/schemas/dms/projects.js
0 → 100644
差异被折叠。
src/services/dms/hooks.js
0 → 100644
差异被折叠。
差异被折叠。
src/services/dms/projects/crud.js
0 → 100644
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
请
注册
或者
登录
后发表评论