Midway Hooks 文件路由实战:用纯函数与文件目录快速生成 API 接口
后端微服务云原生【免费下载链接】midway A Node.js Serverless Framework for front-end/full-stack developers. Build the application for next decade. Works on AWS, Alibaba Cloud, Tencent Cloud and traditional VM/Container. Super easy integrate with React and Vue. 项目地址https://gitcode.com/gh_mirrors/mi/midway点击查看免费下载本文围绕 Midway Hooksmidwayjs/hooks的Easy Mode简易模式与文件系统路由Filesystem Routing展开讲解如何通过midway.config.ts中的routes配置开启文件路由系统让目录结构、文件命名直接决定 HTTP 接口路径从而在前端/全栈项目中用纯函数快速产出GET/POST接口。读完本文你将掌握简易模式下的接口编写、Api()与路径参数ParamsT的配合使用以及 index 路由、嵌套路由、通配路由、动态路径参数的完整规则并能结合仓库内的 React 全栈示例进行验证。什么是简易模式Simple mode在 Midway Hooks 中简易模式允许**只用普通异步函数pure functions**来快速创建 HTTP 接口无需编写Controller、Get等装饰器。函数即接口导出即路由。使用简易模式需要满足两个前提必须开启文件路由系统需要在midway.config.js或midway.config.ts中配置routes字段接口方法受限由纯函数自动生成的路由只支持GET与POST两种 HTTP 方法在全栈应用中这种自动生成的方式不支持传递Query / Params / Header参数。需要注意即便处于简易模式你仍然可以使用Api()来定义路由并且支持手动指定路径此时basePath会自动拼接到生成的路径前缀中详见下文使用 Api() 创建路由。简易模式接口编写GET 与 POSTGET 请求一个最简单的 GET 接口只需要导出一个异步函数并通过useContext()获取 HTTP 请求上下文import { useContext } from midwayjs/hooks; export async function getPath() { // 通过 Hooks 获取 HTTP 请求上下文 const ctx useContext(); return ctx.path; }集成调用全栈项目零 API直接像调用普通函数一样导入并调用import { getPath } from ./api/lambda; const path await getPath(); console.log(path); // /api/getPath手动调用使用fetcher按生成的路径发起请求fetcher .get(/api/getPath) .then((res) { console.log(res.data); // /api/getPath });POST 请求POST 接口同样是一个普通异步函数函数参数即接口入参import { useContext } from midwayjs/hooks; export async function post ( name: string ) { const ctx useContext(); return { message: Hello ${name}!, method: ctx.method }; }集成调用import { post } from ./api/lambda; const response await post(Midway); console.log(response.data); // { message: Hello Midway!, method: POST}手动调用手动调用时函数入参需要放在 HTTP Body 的args数组中传递fetch(/api/post, { method: POST, headers: { Content-Type: application/json, }, body: JSON.stringify({ args: [Midway] }), }).then((res) { console.log(res.data); // { message: Hello Midway!, method: POST} });使用 Api() 创建路由在简易模式下你依然可以使用Api()来创建路由但需要注意路径指定方式的约束无效写法Api(Get(/specify_path))—— 简易模式下不支持手动指定路径有效写法不传路径由文件系统自动生成。下面是一个同时导出两条路由的合法示例getPath为具名导出default为默认导出二者路由均由文件系统自动生成import { Api, Get } from midwayjs/hooks; import { useContext } from midwayjs/hooks; export async function getPath() { // 通过 Hooks 获取 HTTP 请求上下文 const ctx useContext(); return ctx.path; } export default Api(Get(), async () { return Hello Midway!; });开启文件系统路由midway.config.ts 配置在midway.config.js或midway.config.ts中开启routes配置即可同时启用文件路由系统与简易模式import { defineConfig } from midwayjs/hooks; export default defineConfig({ source: ./src/apis, routes: [ { baseDir: lambda, basePath: /api, }, ], });字段说明字段说明默认值 / 取值范围source后端代码目录默认./src/apis也可自定义为./src/functions等目录routes路由配置默认是一个数组数组可包含多个路由组routes[].baseDir函数目录该目录下任意.ts文件中导出的异步函数都会自动生成为 Api 接口相对source的目录名如lambdaroutes[].basePath生成的 Api 地址前缀如/api仓库内的真实示例 site/example/function/midway.config.ts 与上述配置完全一致对应的后端接口目录为src/apis/lambda其下index.ts中默认导出GET与具名导出postPOST分别被生成为接口见 site/example/function/src/apis/lambda/index.ts。路由生成规则开启文件路由后目录结构与文件命名将直接决定最终的路由路径。以下是全部规则。Index 路由index.ts 作为根路由目录下的index.ts文件会作为该目录的根路由/lambda/index.ts→//lambda/about/index.ts→/about嵌套路由文件与目录逐级映射嵌套文件会生成嵌套路由/lambda/about.ts→/about/lambda/blog/index.ts→/blog/lambda/about/contact.ts→/about/contact导出方式与路由的对应关系文件内默认导出的函数生成到根路径具名导出的函数则将函数名拼接到路径上。以/lambda/about.ts为例export default () {}→/aboutexport function contact ()→/about/contact提示结合前文的示例/lambda/index.ts中默认导出对应根路径具名导出post则对应/api/post与示例测试 site/example/function/src/apis/lambda/index.test.ts 中断言的GET/POST行为一致。通配路由Wildcard routing如果需要生成通配路由例如/api/*用于匹配/api、/api/about、/api/about/a/B/c等文件名使用[...file]格式。 建议通配路由中只使用export default导出函数以避免不必要的路由冲突。示例/lambda/[...index].ts→/api/*/lambda/[...user].ts→/api/user/*/lambda/about/[...contact].ts→/api/about/contact/*路径参数Path parameters如果需要生成动态路径参数文件名使用[file]格式/lambda/[name]/project.ts→/api/about/:name/project请求/about/midwayjs/project→{ name: midwayjs }/lambda/[type]/[page].ts→/api/about/:type/:page请求/blog/1→{ type: blog, page: 1 }请求/articles/3→{ type: articles, page: 3 }使用路径参数时只能使用Api()开发后端接口并使用ParamsT标记类型。以/lambda/[name]/project.ts为例// lambda/[name]/project.ts import { Api, Get, Params, useContext } from midwayjs/hooks; export default Api ( Get(), Params{ name: string }(), async () { const ctx useContext(); return { name: ctx.params.name }; } );集成调用全栈项目中通过params传参import getProject from ./api/[name]/project; const response await getProject({ params: { name: midwayjs} }); console.log(response); // { name: midwayjs}手动调用fetch(/api/about/midwayjs/project) .then((res) res.json()) .then((res) console.log(res)); // { name: midwayjs}结合仓库示例验证一个完整的 React 全栈应用仓库中的 site/example/function 是一个名为midway-hooks-react的完整示例其依赖包括midwayjs/hooks、midwayjs/koa、react与vite见 site/example/function/package.json。它的目录结构与本文档描述的规则一一对应. ├── midway.config.ts // 配置目录与路由 ├── src │ ├── apis // 后端目录source │ │ ├── configuration.ts // Hooks 配置 │ │ └── lambda // Api 目录对应 routes[].baseDir │ │ ├── index.test.ts // Api 单元测试 │ │ └── index.ts // Api 接口文件 │ ├── App.tsx // React 前端 │ └── main.tsx └── vite.config.ts后端接口文件 site/example/function/src/apis/lambda/index.ts 中默认导出GET/api与具名导出postPOST/api/post同时存在前端 site/example/function/src/App.tsx 直接import hello, { post } from ./apis/lambda并像调用普通函数一样调用hello()、post(message)正是零 API 集成调用的典型用法单元测试 site/example/function/src/apis/lambda/index.test.ts 通过midwayjs/hooks-testing-library的createApp()创建应用用app.runFunction与app.request两种方式验证了默认导出返回{ message: Hello World, method: GET }、post返回{ method: POST, name: Jake }的行为Hooks 配置 site/example/function/src/apis/configuration.ts 通过createConfiguration导入hooks并挂载koa-bodyparser中间件保证 POST body 可以解析Vite 侧通过 site/example/function/vite.config.ts 接入midwayjs/vite-plugin-hooks插件实现开发期前后端一体化。运行该示例开发模式执行npm run dev构建执行npm run build先后执行build:client与build:server生产模式执行node bootstrap.js。与 Api() 完整 API 的衔接本主题聚焦于文件路由与简易模式当需要处理QueryT、HeadersT、HttpCode、SetHeader、Redirect、ContentType等更完整的能力时可继续阅读同目录下的 API 开发文档其中详细列出了All / Get / Post / Put / Delete / Patch / Head / Options全部 HTTP 触发器及其用法与本主题中的Api(Get(), Params...())写法一脉相承。小结与注意事项简易模式的本质是函数即接口source指定后端目录routes[].baseDir指定接口目录basePath指定统一前缀自动生成的路由只支持GET/POST且不自动支持Query / Params / Header传参需要动态路径参数时必须使用Api()ParamsTindex.ts映射根路径嵌套目录/文件逐级映射路径具名导出拼接函数名[name]声明路径参数[...name]声明通配路由通配路由中建议只使用默认导出避免路由冲突文件路由的最终路径由basePath 文件系统映射路径拼接而成手动调用时需按完整路径含basePath前缀发起请求。赞分享后端微服务云原生【免费下载链接】midway A Node.js Serverless Framework for front-end/full-stack developers. Build the application for next decade. Works on AWS, Alibaba Cloud, Tencent Cloud and traditional VM/Container. Super easy integrate with React and Vue. 项目地址https://gitcode.com/gh_mirrors/mi/midway点击查看免费下载相关推荐Midway Hooks 文件路由Filesystem Routing实战从纯函数到 RESTful 接口的零配置之路Midway Hooks 文件路由Filesystem Routing实战从纯函数到 RESTful 接口的零配置之路 Midway Hooks 是 Mi后端微服务云原生Midway 简易模式与文件系统路由用纯函数把目录结构变成 HTTP APIMidway 简易模式与文件系统路由用纯函数把目录结构变成 HTTP API 在 Midway Hooks 中简易模式与文件系统路由是面向全栈开发者后端微服务云原生使用 XTuner QLoRA 微调 InternLM2-7B-Chat最低 8GB 显存打造专属职场教练大模型使用 XTuner QLoRA 微调 InternLM2 7B Chat最低 8GB 显存打造专属职场教练大模型 本指南以《开源大模型食用指南》项目中 Int后端微服务云原生创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

别漏掉 mmproj!embeddinggemma-2-GGUF 多模态投影器文件在图像与视频理解中的关键作用详解

别漏掉 mmproj!embeddinggemma-2-GGUF 多模态投影器文件在图像与视频理解中的关键作用详解

别漏掉 mmproj!embeddinggemma-2-GGUF 多模态投影器文件在图像与视频理解中的关键作用详解 【免费下载链接】embeddinggemma-2-GGUF 项目地址: https://ai.gitcode.com/hf_mirrors/unsloth/embeddinggemma-2-GGUF 本仓库 embeddinggemma-2-GGUF 提供 Google…

2026/10/10 13:57:39 阅读更多 →
大模型论文 | 大模型上下文工程全解析:ACE框架与Anthropic方法深度对比【收藏必看】

大模型论文 | 大模型上下文工程全解析:ACE框架与Anthropic方法深度对比【收藏必看】

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 13:57:39 阅读更多 →
夜间老鼠检测数据集:低照度小目标检测专用VOC+YOLO双格式

夜间老鼠检测数据集:低照度小目标检测专用VOC+YOLO双格式

简介:本资源是一套专为夜间场景下老鼠目标检测任务构建的轻量级标注数据集,适用于计算机视觉初学者、YOLO系列模型实践者及小动物行为识别研究者。数据集包含316张夜间拍摄的JPEG图像,全部标注为单一类别“laoshu”(老鼠&#xff…

2026/10/10 13:56:36 阅读更多 →

最新新闻

人脸表情识别端到端实战:从OpenCV检测到TensorRT部署

人脸表情识别端到端实战:从OpenCV检测到TensorRT部署

简介:本资源是一份基于Python实现的人脸表情识别入门级开发实践包,面向计算机视觉初学者、后端开发人员及AI兴趣学习者,聚焦人脸68个关键点定位这一核心预处理环节,为后续表情分类与情感分析提供可靠特征基础。压缩包共2个文件&am…

2026/10/10 14:44:48 阅读更多 →
U-Net+PatchGAN图像修复实战:可落地的深度学习方案

U-Net+PatchGAN图像修复实战:可落地的深度学习方案

简介:本资源是一套基于深度学习的图像修复算法完整实现方案,面向计算机、人工智能、电子信息等专业的本科生毕设与课程设计需求,尤其适合正在开展毕业设计或项目实战练习的学习者。内容涵盖可直接运行的Python源码、配套数据集(Pl…

2026/10/10 14:44:48 阅读更多 →
PyTorch deeplabv3人像抠图实战:二分类分割与边缘优化

PyTorch deeplabv3人像抠图实战:二分类分割与边缘优化

简介:本资源面向计算机视觉初学者与语义分割实践者,围绕 PyTorch 自带 deeplabv3 实现人物抠图这一二分类语义分割任务展开,帮助读者掌握从模型调用到预测输出的完整流程。包内共 3453 个文件,以 3411 个 png 图像数据为主&#x…

2026/10/10 14:44:47 阅读更多 →
fsearch 索引越用越大?内存与磁盘占用排查瘦身实录

fsearch 索引越用越大?内存与磁盘占用排查瘦身实录

fsearch 索引越用越大?内存与磁盘占用排查瘦身实录 【免费下载链接】fsearch Whole-disk file search for macOS: fuzzy names, typo tolerance, indexed content grep. ~1 ms over 8M files. 项目地址: https://gitcode.com/gh_mirrors/fsea/fsearch 毫秒级…

2026/10/10 14:44:47 阅读更多 →
openjdk:8-jre镜像拉取失败原因与替代方案详解

openjdk:8-jre镜像拉取失败原因与替代方案详解

如果你最近在本地、CI 流水线或者测试环境里执行docker pull openjdk:8-jre,大概率不是手滑敲错命令,而是这条 tag 本身已经落伍了。我这两年在不同项目里反复见过三类报错:manifest for openjdk:8-jre not found、no matching manifest for …

2026/10/10 14:44:47 阅读更多 →
C# WinForms图书管理系统:远程操作与图片管理实战

C# WinForms图书管理系统:远程操作与图片管理实战

在做一个管理类的小系统时,很多人一开始都会陷入“功能堆砌”的误区——先把增删改查摆上去,再想界面怎么调,最后才发现数据表设计不合理、图片处理一团糟、更别提让其他人通过局域网访问数据库这种事了。这篇博文我想分享一个比较完整的C# W…

2026/10/10 14:43:45 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:25 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →