让微信小程序也能发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 三端同构,希望对你同样有帮助。

相关推荐
luback1 小时前
前端把页面用PDF导出
前端·pdf·reactjs·html2canvas
豹哥学前端1 小时前
10分钟彻底搞懂 window 对象、全局环境与 JS 引擎
前端·面试
晴殇i1 小时前
前端混合状态管理架构:Redux Toolkit + Zustand 协同设计、规范落地与性能优化
前端·openai
OpenTiny社区2 小时前
GenUI SDK 生成式UI:六大开发特性详解,适配多种业务场景
前端·github·ai编程
掘金者阿豪2 小时前
没有公网IP也能远程监控服务器?node_exporter加cpolar把监控接口透传到公网
后端
uzong2 小时前
软件架构设计的考虑:如构建一个长生周期的系统
后端·架构
大家的林语冰2 小时前
TS 登顶第一语言;JS 最新 Temporal 时间减屎;Node 爆发反 AI 运动;CSS 将支持图片亮暗切换《前端周刊》
前端·javascript·css
Hilaku2 小时前
OpenClaw 为什么突然不火了?
前端·javascript·程序员