现象(真实故障):导入示例文件/【奥黛塔】_by_原神.zip 返回 500 Internal server error。 根因一(500): 该 PMX 643 根骨骼、93,350 面,转换本身成功(GLB 23.7MB),但分析结果里的 骨骼树按骨骼逐条展开,JSON 实测 70,980 字节,而 models.stats 是 TEXT (上限 65,535)。MySQL/MariaDB 严格模式直接拒绝写入(ER_DATA_TOO_LONG / 1406),而这一步没有兜底 -> 未捕获 -> 500。 根因二(丢贴图): tex/髮.png 的 GBK 字节是 F3 8C。文件名解码先试 Shift-JIS,而 WHATWG 的 shift_jis 把未定义码位映射成私用区不可见字符(不是 U+FFFD),于是被判为 「解码成功」,永不回退 GBK;贴图名对不上,该模型 18 张贴图只内嵌了 17 张。 修复: 1. models.stats -> MEDIUMTEXT(实体 mediumtext + transformer,保留 JSON 语义; 不用 simple-json 以免元数据与库列型不一致),新增迁移 AddModelStatsMediumText1789550000000; 2. 新增 shrinkStatsForStorage() 兜底:即使库未迁移,也只截断骨骼树 (父在前,保留祖先链),面数/骨骼数/humanoid 覆盖/可驱动性/warnings 全部保留; 服务层 saveWithStatsFallback() 仅在 1406/DATA_TOO_LONG 时裁剪重试一次, 其它数据库错误照旧抛出; 3. 压缩包文件名解码把「私用区字符」也算作解错信号,回退 GBK;实测该模型 贴图由 17/18 变为 18/18 全部内嵌; 4. 新增 12 项测试(test/model-stats-limit.spec.ts 9 项 + 压缩包编码/目录条目 3 项); 5. 版本 0.2.3,README(.md/.txt)/DSH.md 补修订说明、500 的 FAQ 与 stats 容量约束。
54 lines
1.7 KiB
JSON
54 lines
1.7 KiB
JSON
{
|
|
"name": "opendance-web-server",
|
|
"version": "0.2.3",
|
|
"description": "OpenDance Studio Web 管理服务端(NestJS + TypeORM + 现有 MySQL 实例)",
|
|
"license": "MIT",
|
|
"private": true,
|
|
"engines": {
|
|
"node": ">=22.0.0"
|
|
},
|
|
"scripts": {
|
|
"build": "nest build",
|
|
"start": "nest start",
|
|
"start:dev": "nest start --watch",
|
|
"start:prod": "node dist/main.js",
|
|
"typecheck": "tsc --noEmit",
|
|
"test": "vitest run",
|
|
"test:watch": "vitest",
|
|
"test:smoke": "node test/smoke.mjs",
|
|
"contracts:check": "node scripts/check-contracts.mjs && node scripts/check-routes.mjs",
|
|
"verify": "npm run contracts:check && npm run typecheck && npm run test && npm run build",
|
|
"typeorm": "node scripts/migrate.mjs",
|
|
"migration:generate": "node scripts/migrate.mjs generate",
|
|
"migration:run": "node scripts/migrate.mjs run",
|
|
"migration:revert": "node scripts/migrate.mjs revert",
|
|
"migration:show": "node scripts/migrate.mjs show"
|
|
},
|
|
"dependencies": {
|
|
"@nestjs/common": "^11.0.12",
|
|
"@nestjs/config": "^4.0.2",
|
|
"@nestjs/core": "^11.0.12",
|
|
"@nestjs/platform-express": "^11.0.12",
|
|
"@nestjs/typeorm": "^11.0.0",
|
|
"class-transformer": "^0.5.1",
|
|
"class-validator": "^0.14.1",
|
|
"dotenv": "^16.4.7",
|
|
"mysql2": "^3.12.0",
|
|
"reflect-metadata": "^0.2.2",
|
|
"rxjs": "^7.8.2",
|
|
"typeorm": "^0.3.21"
|
|
},
|
|
"devDependencies": {
|
|
"@nestjs/cli": "^11.0.5",
|
|
"@nestjs/schematics": "^11.0.2",
|
|
"@types/express": "^5.0.0",
|
|
"@types/multer": "^1.4.12",
|
|
"@types/node": "^22.13.10",
|
|
"source-map-support": "^0.5.21",
|
|
"ts-node": "^10.9.2",
|
|
"tsconfig-paths": "^4.2.0",
|
|
"typescript": "^5.7.3",
|
|
"vitest": "^3.0.8"
|
|
}
|
|
}
|