如何用 emulate 的 defineEmulator 编写自己的有状态 HTTP API:自定义模拟器完整教程
【免费下载链接】emulateLocal API emulation for CI and no-network sandboxes项目地址https://gitcode.com/gh_mirrors/emul/emulate点击查看免费下载emulate 是面向 CI 与无网络沙箱的本地 API 模拟API emulation工具内置 14 个生产级有状态服务模拟器借助它的defineEmulator你只需要一个 TypeScript 模块就能编写属于自己的自定义模拟器——一个真正有状态、可重置、可测试的本地 HTTP API。本教程带你从一键脚手架到测试调试完整走通自定义模拟器的编写流程。1️⃣ 为什么自定义模拟器优于传统 mock传统 mock 返回写死的静态响应请求之间互不影响而 emulate 的自定义模拟器是**完全有状态Fully stateful**的每次请求都会真实地读写状态和真实 API 的行为一致。能力静态 mockdefineEmulator 自定义模拟器请求之间共享状态❌✅ 状态由state()管理重置回初始数据❌✅reset()一键回滚浏览器查看请求与状态❌✅ 内置 Inspector/_emulate不开端口跑测试❌✅listen: false进程内直调与 GitHub/Stripe 等内置服务共存❌✅ 同一份配置混合启动2️⃣ 三步快速起步用 init 命令生成 inventory 自定义模拟器在项目里执行下面三条命令一条都不用改就能跑起来npm install -D emulate npx emulate init --custom inventory npx emulate start --watchinit --custom会自动生成三个文件emulators/inventory.ts —— 模拟器定义核心emulators/inventory.test.ts —— 可直接运行的 Node 测试emulate.config.ts —— 服务注册配置脚手架实现的inventory就是一个典型的有状态库存 API初始库存 10 件POST /reservations扣库存并返回 201取消预约归还库存卖光后返回 409。想象一下你在管理下面这类商品start命令会打印服务 URL 和 Inspector 链接端口取决于配置。完整的运行流程可参考 examples/custom-api/README.md。3️⃣ 读懂 defineEmulator三个字段搞定有状态 API自定义模拟器的核心就是defineEmulator的三要素name、state、setupimport { defineEmulator } from emulate export default defineEmulator({ name: counter, // 服务名小写字母、数字、连字符 state: () ({ count: 0 }), // 初始状态工厂每个实例独立 setup({ app, state }) { // 注册路由必须保持同步 app.get(/count, (c) c.json(state)) app.post(/increment, (c) c.json({ count: state.count })) }, })新手需要记住的 4 条规则源码定义见 packages/emulators/core/src/custom.ts可变状态只放进state()不要放在模块级变量里否则reset()无法还原状态必须 JSON 兼容对象、数组、有限数字、字符串、布尔、null日期用字符串表示setup的上下文还提供baseUrl对外宣告的 URL、signal生命周期信号和onDispose清理回调路由支持get/post/put/patch/delete/on/use/onError/notFound响应用c.json、c.text、c.redirect等返回/_emulate是管理保留路径请勿占用。4️⃣ 注册到配置让 CLI 认识你的自定义服务在emulate.config.ts里用defineConfig注册即可自定义服务可以和内置服务混排共存import { defineConfig } from emulate import inventory from ./emulators/inventory.ts export default defineConfig({ services: { inventory: { emulator: inventory, port: 4000 }, // 本地自定义模块 github: { emulator: github, port: 4001 }, // 内置服务 }, })YAML / JSON 配置同样支持emulator可以填本地模块路径或已安装的 npm 包Node 24 可原生加载本地 TypeScript无需额外运行时依赖用npx emulate list查看可用服务--config显式指定配置文件实例名不能占用内置服务名。5️⃣ 种子数据、重置与快照有状态 API 的核心玩法操作行为首次启动以state()结果或seed作为重置基线reset()恢复基线副本并重建所有路由处理器seed整体替换初始状态不是深合并snapshot()/restore()带版本号的分离快照restore不回滚基线持久化可选配置persistence文件后自动存盘如果外部夹具需要校验可在定义里加validateSeed(value)非法种子会直接抛出带路径的错误。修改持久化数据结构时记得递增stateVersion。6️⃣ 不开服务器写测试listen: false 技巧自定义模拟器最大的便利是同一份定义既给 CLI 用也给测试用。listen: false时request()直接走 HTTP 处理器全程不占端口const api await createEmulator({ service: inventory, listen: false }) try { const res await api.request(/reservations, { method: POST }) // 201 console.log(await (await api.request(/inventory)).json()) // { stock: 9 } await api.reset() } finally { await api.close() }api.request走的就是与真实 HTTP 相同的处理器还能验证领域错误如 409 缺货。脚手架生成的 inventory.test.ts 用node --test直接就能跑无需任何测试框架在 Vitest/Jest 中则在 setup 里建实例、afterEach里reset()。SDK 类测试可用port: 0拿到随机端口的真实api.url。7️⃣ Inspector 可视化调试请求与状态一目了然start --watch启动后打开打印出的/_emulate地址即可在浏览器中查看Requests请求记录、Routes路由表、State当前状态并一键 Reset 回初始种子。几个贴心细节access_token、refresh_token、client_secret等敏感字段在预览中自动打码--watch热重载本地模块重载成功后自动重置回种子状态认证头、超大/二进制/流式内容会被省略或摘要不会撑爆面板。8️⃣ 常见问题快速排查清单现象解决方法找不到依赖包包要装在配置文件所在的项目里npx下载的 CLI 不会替你装包发现多个配置文件用--config file显式指定其一种子字段报错提供完整状态对象检查定义里的validateSeed状态重置后仍有残留检查是否误用了模块级变量存放可变状态端口被占用修改该实例的port启动会报告失败并自动关闭已开服务运行时读取的夹具不触发重载把它加进配置的watch路径 延伸资料完整可运行示例含配置与测试examples/custom-api/官方文档页源码apps/web/app/docs/custom-apis/page.mdx自定义 API 技能说明skills/custom-apis/SKILL.mdcreateEmulator程序化 APIpackages/emulate/src/api.ts内置服务总览与 CLI 用法README.md想直接体验完整示例克隆仓库后运行对应示例即可git clone https://gitcode.com/gh_mirrors/emul/emulate从defineEmulator三要素到 Inspector 调试你只需要一个 TypeScript 模块就拥有了和生产行为一致的有状态本地 API——这正是 emulate 不是 mock而是真实状态模拟的核心价值。赞分享【免费下载链接】emulateLocal API emulation for CI and no-network sandboxes项目地址https://gitcode.com/gh_mirrors/emul/emulate点击查看免费下载相关推荐如何编写Browserify自定义转换器面向开发者的完整教程如何编写Browserify自定义转换器面向开发者的完整教程 Browserify是一个强大的JavaScript模块打包工具它通过自定义转换器系统提供了极文档教程老Mac升级macOS免费方案用OpenCore Legacy Patcher五步装上新版系统老Mac升级macOS免费方案用OpenCore Legacy Patcher五步装上新版系统 项目概述 OpenCore Legacy Patcher下文操作系统固件驱动开发如何自己编写缓动曲线easing-functions-cj 中 BaseEasingMethod 自定义动画函数完整教程如何自己编写缓动曲线easing functions cj 中 BaseEasingMethod 自定义动画函数完整教程 做动画时你是否想让曲线按自己的节奏OpenHarmony前端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Geant4粒子物理模拟:蒙特卡洛方法与探测器设计实践

Geant4粒子物理模拟:蒙特卡洛方法与探测器设计实践

做粒子物理实验,预算上最容易被低估的从来不是加工费,而是试错成本。探测器里的闪烁体要多厚、吸收体要选多高的原子序数、粒子筛选逻辑有没有漏洞,这些问题如果在拿到真机之前没法回答,团队可能要在反复打样的循环里耗掉整整一两…

2026/10/11 15:22:01 阅读更多 →
Flutter for OpenHarmony:电子合同签署App性能优化实战

Flutter for OpenHarmony:电子合同签署App性能优化实战

电子合同签署这类业务,看起来只是把一份PDF推到手机里然后让人签个字,但真做起来,性能问题一抓一大把。我在适配Flutter for OpenHarmony的过程中,光是让APP在低端设备上不卡顿、不白屏、不爆内存,就折腾了挺长一段时间…

2026/10/11 15:22:01 阅读更多 →
Flutter在OpenHarmony上的性能调优:手写签名与长列表优化实录

Flutter在OpenHarmony上的性能调优:手写签名与长列表优化实录

作为一个常年混迹在移动端的开发者,我这两年最大的感受就是:跨平台框架的“战场”已经从单纯的iOS/Android,悄然蔓延到了国产操作系统上。我自己手上正好有一个实际落地的项目——基于Flutter开发的电子合同签署App,并且要跑在Ope…

2026/10/11 15:22:01 阅读更多 →

最新新闻

Copilot 的 agent、ask、edit、plan 到底怎么用?TaoToken 统一 Key 下的四种模式实战拆解

Copilot 的 agent、ask、edit、plan 到底怎么用?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/12 17:59:28 阅读更多 →
Ryoku 首次登录完全指南:快速上手向导、必学快捷键与桌面初体验

Ryoku 首次登录完全指南:快速上手向导、必学快捷键与桌面初体验

【免费下载链接】ryoku Opinionated premium Arch workstation for powerful desktops and laptops. 项目地址: https://gitcode.com/gh_mirrors/ry/ryoku 点击查看 免费下载 刚装好 Ryoku 却不知从何下手?这篇 Ryoku 首次登录指南帮你用最快速度熟悉这…

2026/10/12 17:59:28 阅读更多 →
Claude Code 接入 DeepSeek 保姆级教程:WSL/Linux 通用配置与 TaoToken 统一 Key 实践

Claude Code 接入 DeepSeek 保姆级教程:WSL/Linux 通用配置与 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/12 17:59:28 阅读更多 →
2026年云主机 Hermes Agent/OpenClaw 配置 Token Plan 安装详细攻略:把 settings 改到 TaoToken

2026年云主机 Hermes Agent/OpenClaw 配置 Token Plan 安装详细攻略:把 settings 改到 TaoToken

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

2026/10/12 17:59:28 阅读更多 →
RabbitMQ监控实战:Prometheus+Grafana搭建与告警规则详解

RabbitMQ监控实战:Prometheus+Grafana搭建与告警规则详解

1. 为什么消息队列的监控值得单独拎出来讲做后端开发这些年,我越来越觉得消息队列这东西有点像家里的水管系统——平时你根本不会注意到它,一旦堵了或者爆了,整个屋子都得遭殃。RabbitMQ 作为消息中间件里的老牌选手,用起来确实顺…

2026/10/12 17:59:28 阅读更多 →
Python电商项目实战:Django+Flask混合架构与订单并发处理方案

Python电商项目实战:Django+Flask混合架构与订单并发处理方案

高峰期系统疯狂报警?别急,先把这套Python电商实战方案吃透从开发第一个用户注册接口,到上线前被并发打蒙,再到重构出稳定的秒杀下单流程,这些年我在电商系统这条路上踩过的坑,比喝过的咖啡都多。今天不聊那…

2026/10/12 17:58:27 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 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/11 10:45:37 阅读更多 →
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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练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/11 14:36:54 阅读更多 →