项目背景在 uni-app TypeScript 开发微信小程序时业务层大量使用了 RESTful 接口其中更新操作用到了PATCH。然而小程序底层仅支持GET/POST/PUT/DELETE…不支持直接写method: PATCH。改动所有接口为PUT不仅语义不纯还可能因「全量覆盖」导致字段误删在前端维护一份「POST 白名单」又分散且易遗漏。最终选择在NestJS 后端引入HTTP Method Override机制继续用POST出站但带一个约定头让服务端把方法还原成PATCH对前端透明、对其他接口零影响。一、原理简介HTTP Method Override方法重写是事实标准的变通方案客户端保持POST请求同时在查询参数_method或请求头X-HTTP-Method-Override里写入目标方法PATCH/PUT/DELETE。服务端中间件在路由匹配前把req.method替换成目标值后续框架逻辑完全无感知。二、NestJS 实现步骤Nest 底层即 Express官方仓库 expressjs/method-override 可直接复用。1. 安装依赖pnpmi method-override# 如果习惯 TS 可再装pnpmi-Dtypes/method-override2. 在 main.ts 注册顺序很关键import{NestFactory}fromnestjs/core;import{NestExpressApplication}fromnestjs/platform-express;import*asmethodOverridefrommethod-override;import{AppModule}from./app.module;asyncfunctionbootstrap(){constappawaitNestFactory.createNestExpressApplication(AppModule);/* 关键一行方法重写 */app.use(methodOverride(X-HTTP-Method-Override));// 只读 header 方式/* 以下代码顺序不变 */app.setGlobalPrefix(api/v1);app.useGlobalPipes(...);app.useGlobalFilters(...);app.enableCors({allowedHeaders:Content-Type,Authorization,X-HTTP-Method-Override,});awaitapp.listen(3000);}bootstrap();3. 保持原有 PATCH 控制器Controller(users)exportclassUserController{Patch(:id)update(Param(id)id:string,Body()dto:UpdateUserDto){returnthis.userService.update(id,dto);}}三、uni-app 前端调用示例继续使用uni.request只改 header// 封装在 utils/http.tsfunctionpatchT(url:string,data?:any,options?:any){returnrequestT({url,method:POST,// ① 表面仍是 POSTheader:{X-HTTP-Method-Override:PATCH,// ② 告诉后端“真实意图”...options?.header,},data,...options,});}/* 使用 */patch(/api/v1/users/1,{email:newexample.com}).then(resconsole.log(更新成功,res))网络实际发出POST /api/v1/users/1 X-HTTP-Method-Override: PATCH Content-Type: application/json {email:newexample.com}经过中间件后Nest 内部req.method PATCH精准进入Patch()路由 Swagger 文档也能正常显示。四、常见疑问问题解答会影响其他正常接口吗不会。只有带X-HTTP-Method-Override头的POST才会被改写其余请求零感知。是否幂等中间件本身无业务逻辑只改方法接口幂等性由你自己的Patch实现保证。上线后想移除怎么办小程序端与后端完全解耦哪天小程序原生支持PATCH直接去掉中间件header 即可业务代码不动。五、小结微信小程序不支持PATCH/PUT/DELETE→ 用Method-Override是最低成本、最语义化的解法。NestJS 底层即 Express一行app.use(methodOverride(X-HTTP-Method-Override))即可全局生效。前端继续发POST只加头后端原有Patch零改动其他接口零影响日后可无缝回退。借助该方法成功稳定运行真机、开发者工具、H5 三端同构希望对你同样有帮助。