http-proxy-middleware 与 Next.js API 路由集成实战:从零搭建 Pages Router 代理
后端API网关【免费下载链接】http-proxy-middleware:zap: The one-liner node.js http-proxy (httpxy) middleware for connect, express, next.js and more项目地址https://gitcode.com/gh_mirrors/ht/http-proxy-middleware点击查看免费下载导读本指南围绕http-proxy-middleware官方仓库中的 Next.js 集成示例 展开讲解如何用一行中间件在 Next.js Pages Router 的 API 路由上搭建反向代理将/api/users请求透明转发到上游服务jsonplaceholder.typicode.com。读完本文你将掌握代理中间件的单例创建、路径重写pathRewrite、Next.js 路由配置externalResolver与bodyParser以及 curl 验证方法并理解其底层实现原理。示例全景两个文件搞定代理示例的核心只有两个文件职责划分非常清晰文件职责pages/api/_proxy.ts创建共享的http-proxy-middleware实例定义代理目标与路径重写规则pages/api/users.ts暴露 Next.js API 路由把请求转交给共享的代理中间件这种一个文件创建实例、一个文件挂载路由的结构是可复用的最佳实践代理配置与路由入口解耦多个 API 路由可以共享同一个代理实例避免为每个请求重复创建中间件详见下文单例说明。第一步创建代理中间件单例pages/api/_proxy.ts 的完整内容如下import type { NextApiRequest, NextApiResponse } from next; import { createProxyMiddleware } from ../../../../dist; // Singleton // prevent a new proxy being created for every request export const proxyMiddleware createProxyMiddlewareNextApiRequest, NextApiResponse({ target: http://jsonplaceholder.typicode.com, changeOrigin: true, pathRewrite: { ^/api/users: /users, }, logger: console, });要点解析泛型类型createProxyMiddlewareNextApiRequest, NextApiResponse显式传入 Next.js 的请求/响应类型让中间件与 Pages Router API 路由的类型体系对齐。这与仓库中 factory.ts 的签名一致createProxyMiddlewareTReq, TRes, TNext默认TReq extends http.IncomingMessage、TRes extends http.ServerResponse而 Next 的NextApiRequest/NextApiResponse恰好满足这两个约束。单例Singleton模块顶层export const导出确保代理中间件只创建一次。从 factory.ts 看createProxyMiddleware内部会new HttpProxyMiddleware(options)并返回其middleware每次调用都会构建完整的代理服务器、注册插件、解析重写规则因此按请求重复调用代价很高——示例注释明确说明这是为了防止每个请求都新建一个 proxy。导入路径示例从../../../../dist导入即引用仓库根目录下构建后的产物在真实业务项目中应改为安装并导入http-proxy-middleware包本身。第二步配置选项逐项说明示例中出现了四个核心选项均可在 src/types.ts 与 src/configuration.ts 中找到对应实现依据target必填上游服务器地址http://jsonplaceholder.typicode.com。configuration.ts 中的verifyConfig会在构造时校验target与router必须至少提供一个否则抛出ERR_CONFIG_FACTORY_TARGET_MISSING错误。因此target是示例这种最简单场景的必备项。changeOrigin: true改写请求头中的Host为代理目标主机。示例目标是jsonplaceholder.typicode.com若不改写 Host部分上游服务会因主机不匹配而拒绝请求。pathRewrite把入站路径/api/users重写为/users后再转发。其底层实现见 src/path-rewriter.tsparsePathRewriteRules会把{ ^/api/users: /users }中的每个键编译为new RegExp(key)转发时依次测试并只应用第一条命中的规则命中后break。因此正则写法^/api/users只匹配以/api/users开头的路径重写后上游收到的是/users。logger: console将调试日志输出到控制台便于排查转发问题。第三步挂载 API 路由并转发pages/api/users.ts 的作用是把 Next.js 收到的请求交给代理中间件import type { NextApiRequest, NextApiResponse, PageConfig } from next; import { proxyMiddleware } from ./_proxy; export default async function handler(req: NextApiRequest, res: NextApiResponse) { return proxyMiddleware(req, res, (result: unknown) { if (result instanceof Error) { throw result; } }); } export const config: PageConfig { api: { externalResolver: true, // Uncomment to fix stalled POST requests // https://github.com/chimurai/http-proxy-middleware/issues/795#issuecomment-1314464432 // bodyParser: false, }, };关键点proxyMiddleware(req, res, next)三段式调用这与 http-proxy-middleware.ts 中middleware的类型签名完全对应它是一个(req, res, next?) Promisevoid的请求处理器。内部流程为先由shouldProxy判断路径是否命中过滤规则再进入prepareProxyRequest依次应用router与pathRewrite最后调用proxy.web(req, res, activeProxyOptions)完成转发若出错会先proxy.emit(error, ...)再调用next(err)。错误回调兜底第三个参数接收next回调当result instanceof Error时直接throw让异常按 Next.js 错误处理链路暴露出来。从源码看转发阶段的异常会同时触发error事件并回调next(err)所以这里既能捕获配置阶段错误如缺少 target也能捕获网络层错误。externalResolver: true显式告知 Next.js响应由外部解析器代理中间件处理避免 Next.js 对未调用res.send()的 API 路由报API resolved without sending a response警告或产生超时干扰。bodyParser默认开启时 Next.js 会先把请求体解析并消费掉导致流式转发的POST/PUT/PATCH请求体丢失、请求卡住。示例中将其以注释形式保留说明当需要把原始请求体流完整转发到上游时应取消注释设置api.bodyParser false让请求体原样传递。启动与验证启动 Next.js 开发服务器在 examples/next-app 目录下执行package.json 中已配置对应 scriptsnpm run dev # 或 yarn dev # 或 pnpm dev # 或 bun dev示例项目基于 Next.js 16.3.5见 package.json 的dependencies开发服务器默认监听http://localhost:3000。浏览器验证在浏览器中打开http://localhost:3000/api/users如果代理配置正确页面将直接显示上游jsonplaceholder.typicode.com/users返回的 JSON 数据约 10 条用户记录。curl 验证curl http://localhost:3000/api/users返回的响应体应来自上游/users端点。同时可以对照观察转发路径请求从/api/users进入经pathRewrite重写为/users后到达目标服务这正是 path-rewriter.ts 中编译正则 → 测试 → 替换 → break流程的实战体现。请求流转全景把上述代码串联起来一次代理请求的完整生命周期如下浏览器/curl 请求http://localhost:3000/api/usersNext.js Pages Router 命中 pages/api/users.ts 导出的handlerhandler调用共享的proxyMiddleware(req, res, next)进入 http-proxy-middleware.ts 的中间件主流程shouldProxy判断示例未配置pathFilter默认全部命中→prepareProxyRequest应用pathRewrite将req.url从/api/users改写为/usersproxy.web携带改写后的路径与changeOrigin: true的 Host 头转发到http://jsonplaceholder.typicode.com上游响应原样返回给浏览器/curl用户看到的是完整代理透明转发的结果。值得一提的是http-proxy-middleware.ts 中prepareProxyRequest的顺序是先router、后pathRewrite注释明确说明router 基于原始路径做目标路由而非重写后的路径。理解这一点有助于排查目标选错/路径被改类的疑难问题。常见坑位与排查建议POST 请求卡住/无响应优先检查是否设置了api.bodyParser false。Next.js 默认 bodyParser 会提前消费请求体导致转发时无体可传。示例注释已给出官方 issue 链接#795佐证该问题。API resolved without sending a response警告确认已设置api.externalResolver true让 Next.js 明白响应由代理中间件接管。404 或内容不符检查pathRewrite正则是否精确。示例^/api/users使用^锚定开头若上游需要保留前缀则不应重写。可参考仓库 recipes/pathRewrite.md 获取更多重写场景。路径不命中代理示例未配置pathFilter所有请求都会进入转发若业务上只想代理部分路径可参照 src/path-filter.ts 与 recipes/pathFilter.md 配置过滤规则。延伸阅读仓库根目录 README.md完整的选项表与 API 文档recipes/basic.md 与 recipes/pathRewrite.md基础用法与路径重写专题examples/README.mdExpress、Fastify、Hono、WebSocket、SSE 等更多框架示例src/http-proxy-middleware.ts中间件主流程与错误处理实现适合深入源码时对照阅读。赞分享后端API网关【免费下载链接】http-proxy-middleware:zap: The one-liner node.js http-proxy (httpxy) middleware for connect, express, next.js and more项目地址https://gitcode.com/gh_mirrors/ht/http-proxy-middleware点击查看免费下载相关推荐http-proxy-middleware 多服务器接入实战从 http.createServer 到 Express、Next.js 的一行代理集成指南http proxy middleware 多服务器接入实战从 http.createServer 到 Express、Next.js 的一行代理集成指南 h后端API网关在 Next.js Pages Router 项目中集成 Material UI从零搭建可运行示例指南在 Next.js Pages Router 项目中集成 Material UI从零搭建可运行示例指南 本篇指南以 MUI 官方示例项目 examples/m前端UI组件设计系统深入理解http-proxy-middleware中的路由功能深入理解http proxy middleware中的路由功能 前言 在现代Web开发中代理中间件是不可或缺的工具它能够帮助我们实现请求转发、API聚合、跨后端API网关创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考