如何在NestJS应用中实现JSON-Server模拟外部API?
NestJS 配合 json-server 实现外部API模拟方案
完全可以用json-server实现外部API模拟,不需要侵入NestJS业务代码,两个模拟接口的实现不需要写在NestJS的src业务目录下,按以下步骤操作即可:
- 安装依赖
在项目根目录执行安装命令:npm install json-server --save-dev - 创建mock专属目录与文件
在项目根目录新建mock文件夹,所有模拟逻辑都放在这个文件夹下,和NestJS核心业务代码完全隔离:- 新建
mock/db.json作为模拟数据源,基础内容如下:
{ "mockList": [ { "id": 1, "title": "测试数据", "desc": "GET接口默认返回内容" } ] }- 新建
mock/server.js编写自定义接口逻辑,你需要的1个GET、1个POST接口直接写在这个文件里即可:
const jsonServer = require('json-server'); const server = jsonServer.create(); const router = jsonServer.router('mock/db.json'); const middlewares = jsonServer.defaults(); // 内置中间件,支持日志、跨域、body解析 server.use(middlewares); // 自定义GET模拟接口 server.get('/api/external/get-data', (req, res) => { const list = router.db.get('mockList').value(); res.status(200).json({ code: 0, data: list, message: '请求成功' }) }) // 自定义POST模拟接口 server.post('/api/external/submit-data', (req, res) => { const newRecord = { id: Date.now(), ...req.body } router.db.get('mockList').push(newRecord).write(); res.status(200).json({ code: 0, data: newRecord, message: '提交成功' }) }) server.use(router); // mock服务单独跑3001端口,和NestJS默认服务端口不冲突 server.listen(3001, () => { console.log('Mock服务已启动:http://localhost:3001'); }) - 新建
- 配置启动命令
打开项目根目录的package.json,在scripts节点下新增mock服务启动命令:{ "scripts": { // 原有NestJS启动、构建命令保留即可 "start:mock": "node mock/server.js" } } - 日常使用
开发环境下开两个终端,一个正常启动NestJS服务(比如默认跑3000端口),另一个执行npm run start:mock启动mock服务。NestJS业务代码里调用外部API时,把请求基地址改成http://localhost:3001即可正常访问你写的两个模拟接口,后续切换真实外部API时,只需要修改请求配置的基地址,不需要改动业务逻辑。
注意:不要把json-server的模拟逻辑写到NestJS的controller、service文件里,两个服务是独立运行的,隔离后不会对生产环境代码造成任何冗余影响。
内容的提问来源于stack exchange,提问作者Akki
相关产品推荐
相关产品推荐

