skip to content
LOGO CLUE
目录

项目背景

在 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. 安装依赖

Terminal window
npm i method-override
# 如果习惯 TS 可再装
npm i -D @types/method-override

2. 在 main.ts 注册(顺序很关键)

import { NestFactory } from '@nestjs/core';
import { NestExpressApplication } from '@nestjs/platform-express';
import * as methodOverride from 'method-override';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create<NestExpressApplication>(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',
});
await app.listen(3000);
}
bootstrap();

3. 保持原有 PATCH 控制器

@Controller('users')
export class UserController {
@Patch(':id')
update(@Param('id') id: string, @Body() dto: UpdateUserDto) {
return this.userService.update(+id, dto);
}
}

三、uni-app 前端调用示例

继续使用 uni.request只改 header

// 封装在 utils/http.ts
function patch<T>(url: string, data?: any, options?: any) {
return request<T>({
url,
method: 'POST', // ① 表面仍是 POST
header: {
'X-HTTP-Method-Override': 'PATCH', // ② 告诉后端“真实意图”
...options?.header,
},
data,
...options,
});
}
/* 使用 */
patch('/api/v1/users/1', { email: 'new@example.com' })
.then(res => console.log('更新成功', res))

网络实际发出:

POST /api/v1/users/1
X-HTTP-Method-Override: PATCH
Content-Type: application/json
{"email":"new@example.com"}

经过中间件后,Nest 内部 req.method === 'PATCH'精准进入 @Patch() 路由, Swagger 文档也能正常显示。


四、常见疑问

问题解答
会影响其他正常接口吗?不会。只有带 X-HTTP-Method-Override 头的 POST 才会被改写,其余请求零感知。
是否幂等?中间件本身无业务逻辑,只改方法;接口幂等性由你自己的 @Patch 实现保证。
上线后想移除怎么办?小程序端与后端完全解耦;哪天小程序原生支持 PATCH,直接去掉中间件+header 即可,业务代码不动。

五、小结

  1. 微信小程序不支持 PATCH/PUT/DELETE → 用 Method-Override 是最低成本、最语义化的解法。
  2. NestJS 底层即 Express,一行 app.use(methodOverride('X-HTTP-Method-Override')) 即可全局生效。
  3. 前端继续发 POST只加头;后端原有 @Patch 零改动,其他接口零影响,日后可无缝回退。

借助该方法,成功稳定运行,真机、开发者工具、H5 三端同构,希望对你同样有帮助。