让微信小程序也能发PATCH

项目背景

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

bash 复制代码
npm i method-override

# 如果习惯 TS 可再装

npm i -D @types/method-override

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

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 控制器

ts 复制代码
@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

ts 复制代码
// 封装在 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))

网络实际发出:

bash 复制代码
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 三端同构,希望对你同样有帮助。

相关推荐
mCell6 小时前
AI 时代 SVG 画图的潜力
前端·agent·svg
我命由我1234511 小时前
CesiumJS 笔记 - 获取容器中心点、Cartesian3 clone 方法、修改 Cartesian3 对象的高度
前端·javascript·css·前端框架·html·html5·js
Hopebearer_12 小时前
页面突然只剩 DOM?一次静态资源版本错配排查
前端·部署
东风破_13 小时前
ESLint 是什么?为什么你的项目需要它?
前端·后端·代码规范
嘻哈∠※13 小时前
0061基于 SpringBoot 的投稿与稿件处理系统设计与实现
java·spring boot·后端
卷无止境13 小时前
在 awesome-fastapi 里,哪些库值得一看?
后端·python
圣殿骑士-Khtangc14 小时前
Go字符串高效拼接性能对比与底层原理分析
服务器·前端·golang
卷无止境15 小时前
FastAPI 的Admin面板生态
后端·python
BigTopOne15 小时前
【ijkplayer】 硬解码流程
前端
kyriewen16 小时前
DeepSeek Harness开源第一天我就上手了——和Claude Code的差距比想象中大
前端·ai编程·deepseek