JSON-Server

一个在前端本地运行,可以存储json数据的server。前端开发可以模拟服务端接口数据,在本地搭建一个JSON服务,自己产生测试数据。

  1. 使用npm全局安装json-server :npm install -g json-server
  2. 可以通过查看版本号,来测试是否安装成功:json-server -v
  3. 创建json数据——db.json
    在任意一个文件夹下(此处假设创建一个server文件夹),进入到该文件夹里面,执行代码 json-server --watch db.json
  4. 此时文件夹下多出一个db.json文件
  5. 启动json-server --watch db.json,访问 http://localhost:3000/
  6. 分别点击/posts /comments /profile /db链接,我们可以看到访问不同URL返回不同的json数据。其中 /db返回的是整个json文件的数据。
  • 修改端口号
    默认3000 --port 3004或者在db.json同级文件夹新建一个package.json,在script配置添加运行命令:
{"scripts": {"mock": "json-server db.json --port 3004"}
}
//运行时, 直接在当前文件夹下执行 npm run mock
  • 操作数据 | 增删改查
    json-server 支持 restful 风格的api,可以通过不同的请求方式,对数据进行增删改查等不同的操作。
    先修改db.json文件:
{"users": [{"id": 1,"name": "liaoyi","phone": "13246566776","age": 22,"classId": "1002"},{"name": "林更新","age": "44","id": 4,"classId": "1003"},{"name": "李响","phone": "18779756778","age": "26","id": 5,"classId": "1003"},{"name": "陈温柔","phone": "18779756000","age": "22","id": 6,"sex": "0","classId": "1004"},{"name": "夏琪","phone": "13246579999","age": "22","id": 7,"classId": "1004"}],"class": [{"id": "1","title": "前端","staff": ["1002","1004"]},{"id": "2","title": "后端","staff": ["1003"]}],"fruits": [{"id": 1,"name": "苹果","price": 1.28},{"id": 2,"name": "橘子","price": 3.88},{"id": 3,"name": "宁夏西瓜","price": 1.98},{"id": 4,"name": "麒麟西瓜","price": 3.98},{"id": 5,"name": "红蛇果","price": 2.5},{"id": 6,"name": "黑皮西瓜","price": 0.98},{"id": 7,"name": "红心火龙果","price": 2.69},{"id": 8,"name": "国产火龙果","price": 1.69},{"id": 9,"name": "海南荔枝","price": 9.9},{"id": 10,"name": "陕西冬枣","price": 5.39},{"id": 11,"name": "软籽石榴","price": 2.39},{"id": 12,"name": "蜜橘","price": 1.99},{"id": 13,"name": "海南香蕉","price": 1.45}],"person": [{"name": {"firstname": "liao","lastname": "yi"},"pwd": "qwerst54"},{"name": {"firstname": "wang","lastname": "wu"},"pwd": "adasff11"}]
}
  • get 获取数据
    浏览器可以直接访问GET请求,可以直接在浏览器访问就能看到返回的json数据。
    获取所有用户数据(对象数组): http://localhost:3004/users
    获取所有水果数据:http://localhost:3004/fruits
    获取数据
    根据 id 获取 users 数据:http://localhost:3004/users/1
//get请求的query参数
http://localhost:3004/users?id=1//传入不同的条件
// 查找名字为 'liaoyi' 的用户
http://localhost:3004/users?name=liaoyi//多个条件 用&符号连接:
http://localhost:3004/fruits?name=橘子&price=3.88
//甚至还可以使用对象取属性值 obj.key 的方式http://localhost:3004/person?name.firstname=liao//分页采用 _page 来设置页码,
// _limit 来控制每页显示条数。
//如果没有指定 _limit ,默认每页显示10条。
http://localhost:3004/fruits?_page=1&_limit=5
http://localhost:3004/fruits?_page=1&_limit=10
http://localhost:3004/fruits?_page=2&_limit=5//排序采用 _sort 来指定要排序的字段,
// _order 来指定排序是正排序还是逆排序(asc | desc ,默认是asc)。
http://localhost:3004/fruits?_sort=price
http://localhost:3004/fruits?_sort=price&_order=desc//获取局部数据
//_start 来指定开始位置, _end 来指定结束位置、
//或者_limit指定从开始位置起往后取几个数据。类似Array.slice() 方法
# 使用 _end
http://localhost:3004/fruits?_start=2&_end=4# 使用 _limit
http://localhost:3004/fruits?_start=2&_limit=4//获取符合某个范围的数据
1. 使用 _gte 和 _lte 来设置一个取值范围 :
2. 使用 _ne 来获取不包含某个值的数据
3. 采用 _like 来设置匹配某个字符串(或正则表达式)
http://localhost:3004/fruits?id_gte=4&id_lte=6
http://localhost:3004/fruits?id_ne=1&id_ne=10
http://localhost:3004/fruits?name_like=//搜索功能 采用 q 来设置搜索内容:
http://localhost:3004/fruits?q=
  • 除get请求外,其他请求方式需要我们通过 api 调试工具或者代码的方式来使用。如apifox
<template><el-button @click="add"> 发送请求 </el-button>
</template><script setup>import axios from 'axios'const url = 'http://localhost:3004/users'const add = async () => {const data = {name: '林更新',phone: '18779756000',age: '22'}const { data: res } = await axios({ method: 'post', url, data })console.log('res', res)}
</script><template><el-button @click="deleteUser"> 删除用户 </el-button>
</template><script setup>
import axios from 'axios'const userId = 3
const url = `http://localhost:3004/users/${userId}`
const deleteUser = async () => {const res = await axios({ method: 'delete', url })console.log('res', res)
}
</script>

PUT方法会更新整个资源对象,前端没有给出的字段,会自动清空。但是使用put修改后会有一个问题,只会保留提交的字段,没有提交的字段在json中将会被删除
patch 修改数据 :只修改请求的字段,没有请求的字段将会被保留。

<template><el-button @click="reviseUser"> put 修改用户 </el-button>
</template><script setup>
import axios from 'axios'const userId = 4
const url = `http://localhost:3004/users/${userId}`
const reviseUser = async () => {const data = {"name": "林更新","age": "44"}const res = await axios({ method: 'put', url, data })console.log('res', res)
}
</script><template><el-button @click="reviseUser"> patch修改用户 </el-button>
</template><script setup>
import axios from 'axios'const userId = 8
const url = `http://localhost:3004/users/${userId}`
const reviseUser = async () => {const data = {name: "陈温柔",age: "22",sex: "0"
}const res = await axios({ method: 'patch', url, data })console.log('res', res)
}
</script>
  • 多表查询 | 关联检索
  1. 向上关联
    通过 _expand 方式检索关联父级数据,多对一关系,所以条件是单数。
    这里的 _expand=class 匹配即和 users 对象中的 classId做关联,但是已经存在classId字段则写出 class, 比如检索的是 repaId 写成 repa
  2. 通过 _embed 方式检索关联子级数据
    注意: 这里_embed 需要和子表名 (要关联的子集属性名) 匹配。一对多关系,所以匹配条件是负数。
//向上关联父级数据
//class 是一个别名
http://localhost:3004/users?_expand=class
//res:
[{"id": 1,"name": "liaoyi","phone": "13246566776","age": 22,"classId": "1","class": {"id": "1","title": "前端","staff": ["7","6","1"]}},{"name": "林更新","age": "44","id": 4,"classId": "2","class": {"id": "2","title": "后端","staff": ["4","5"]}},{"name": "李响","phone": "18779756778","age": "26","id": 5,"classId": "2","class": {"id": "2","title": "后端","staff": ["4","5"]}},{"name": "陈温柔","phone": "18779756000","age": "22","id": 6,"sex": "0","classId": "1","class": {"id": "1","title": "前端","staff": ["7","6","1"]}},{"name": "夏琪","phone": "13246579999","age": "22","id": 7,"classId": "1","class": {"id": "1","title": "前端","staff": ["7","6","1"]}}
]
//向下关联子级数据
http://localhost:3004/classes?_embed=users
//res:
[{"id": "1","title": "前端","staffIds": ["1001","1004","1005"],"users": [{"id": "1001","name": "liaoyi","phone": "13246566776","age": 22,"classId": "1"},{"name": "陈温柔","phone": "18779756000","age": "22","id": "1004","sex": "0","classId": "1"},{"name": "夏琪","phone": "13246579999","age": "22","id": "1005","classId": "1"}]},{"id": "2","title": "后端","staffIds": ["1002","1003"],"users": [{"name": "林更新","age": "44","id": "1002","classId": "2"},{"name": "李响","phone": "18779756778","age": "26","id": "1003","classId": "2"}]}
]
  • 静态部署
    新增配置文件 config.json 并写入
{"port": "3000",   // 设置端口号"watch": true,   // 是否开启监听"static": "./public/",  // 静态资源目录"read-only": false,   // 是否只读"no-cors": true,   // 是否支持跨域"no-gzip": false  // 是否开启压缩
}
//启动命令
json-server --watch data.json config.json//或者放入package.json+npm run mock
{"scripts": {"mock": "json-server --watch data.json config.json"}
}

mock.js

  • Mock.js + json-server 模拟数据
  1. 创建一个文件夹名为 mock_json
  2. 进入文件夹后初始化package.json 文件
  3. 下载依赖
mkdir mock_json
cd mock_json
npm init 
npm install  json-server mockjs
  1. 添加启动脚本
{"name": "mock_json","scripts": {"dev": "json-server --watch db.js --port 3000"},"dependencies": {"json-server": "^0.17.4","mockjs": "^1.1.0"}
}
  1. 新建 db.js 文件
const Mock = require('mockjs')const data = Mock.mock({'users|10-20': [{'id|+1': '1','name': '@name','sex|1': ['男', '女'],'age|18-60': 1,'address': '@county(true)','phone': /^1[34578]\d{9}$/,'email': '@email','birthday': '@date','avatar': '@image(200x200, #50B347, #FFF, #78C3FC)','desc': '@cparagraph(1, 3)'}],'products|122000': [{'id|+1': 1,'name': '@word(3,5)','price': '@integer(100,999)','quantity': '@integer(1,50)','brief': '@cparagraph(1, 3)'}],
})
// 想要用 json-server 识别mockjs的模拟数据内容,需要使用 module.exports 进行模块的对外暴露,并且暴露的类型必须是函数
module.exports = () => data/* 上面👆 products 有十二万数据,不能直接打开浏览器访问http://localhost:3000/products,浏览器会奔溃的需要使用查询参分页查询如: http://localhost:3000/products?_page=1&_limit=10 */
  1. 启动项目
npm run dev

注意⚠️:

  1. 想要用 json-server 识别mockjs的模拟数据内容,需要使用 module.exports 进行模块的对外暴露,并且暴露的类型必须是函数。
  2. 上面 products 我们模拟了十二万条数据,启动时会有点慢,并且不能直接使用浏览器访问http://localhost:3000/products,浏览器会奔溃的。需要使用查询参分页查询, 如:http://localhost:3000/products?_page=1&_limit=10

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/91311.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/91311.shtml
英文地址,请注明出处:http://en.pswp.cn/web/91311.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

疏老师-python训练营-Day30模块和库的导入

浙大疏锦行 知识点回顾&#xff1a; 导入官方库的三种手段导入自定义库/模块的方式导入库/模块的核心逻辑&#xff1a;找到根目录&#xff08;python解释器的目录和终端的目录不一致&#xff09; 作业&#xff1a;自己新建几个不同路径文件尝试下如何导入 一.学习知识点 DAY30 …

神经网络知识讨论

AI 核心任务与数据类型&#xff1a;特征提取核心&#xff1a;AI 的核心是从原始输入数据中提取特征&#xff0c;CV 是将图像数据转换为计算机可识别的特征&#xff0c;NLP 是将文本数据转换为特征&#xff0c;数据挖掘是将结构化数据转换为特征。数据类型特点&#xff1a;图像数…

kotlin类型可为空,进行空安全的区别

定义一个可为空的变量b(String?),默认没有&#xff1f;是不可以为空的 var b: String? "Kotlin" b null print(b) // 输出 null默认不可为空 var a: String "Kotlin" a null // 编译器报错&#xff0c;null 不能被赋给不为空的变量空安全调用&#x…

Mysql事务基础

事务是一个不可分割的数据库操作序列&#xff0c;也是数据库并发控制的基本单位&#xff0c;其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态。事务是逻辑上的一组操作&#xff0c;要么都执行&#xff0c;要么都不执行 事务的特点 A&#xff08;Atomicity&#…

FastAPI入门:安装、Pydantic、并发和并行

本系列参考FastAPI官方文档&#xff1a;https://fastapi.tiangolo.com/zh/python-types/安装 使用pip安装&#xff1a; pip install fastapi此外还需要 ASGI 服务器&#xff0c;生产环境可以使用 Uvicorn 或者 Hypercorn。 ASGI服务器&#xff1a;异步服务网关接口&#xff0c;…

欢乐的周末 - 华为OD统一考试(JavaScript 题解)

题目描述 小华和小为是很要好的朋友,他们约定周末一起吃饭。 通过手机交流,他们在地图上选择了多个聚餐地点(由于自然地形等原因,部分聚餐地点不可达)。 求小华和小为都能到达的聚餐地点有多少个? 输入描述 第一行输入m和n,m代表地图的长度,n代表地图的宽度 第二行…

算法竞赛阶段二-数据结构(38)数据结构动态链表list

动态链表&#xff08;List&#xff09;的基本概念动态链表是一种线性数据结构&#xff0c;通过节点间的指针连接实现动态内存分配。与数组不同&#xff0c;链表的大小可随需增减&#xff0c;插入和删除操作的时间复杂度为 O(1)&#xff08;已知位置时&#xff09;&#xff0c;但…

Qt 移动应用推送通知实现

推送通知是移动应用提升用户粘性的核心功能——无论是即时消息提醒、活动推送还是状态更新&#xff0c;都需要通过推送功能触达用户。Qt虽未直接提供跨平台推送API&#xff0c;但可通过集成原生服务&#xff08;如Firebase Cloud Messaging、Apple Push Notification service&a…

Word和WPS文字如何制作分栏试卷?想分几栏分几栏

使用Word和WPS文字制作试卷的时候&#xff0c;通常会使用A3大小的纸张&#xff0c;横向布局。但是如果题目的题干、问题、选项文字太少&#xff0c;会带来试卷上有较大的空白&#xff0c;既不美观又浪费纸&#xff0c;解决办法就是将试卷分栏&#xff0c;根据需要分成多栏&…

ubuntu 安装vmware tools

VMware Workstation菜单栏->虚拟机->安装VMware Tools 打开ubuntu内加载的光盘&#xff0c;复制VMwareTools-10.3.26-22085142.tar.gz&#xff0c;解压出来 sudo ./vmware-install.pl #执行安装软件 VMware Tools 安装完成以后重启Ubuntu&#xff0c;重启以后就可以直…

【实时Linux实战系列】在实时应用中进行负载均衡

在实时应用中&#xff0c;负载均衡是确保系统能够高效处理多个任务的关键技术。通过合理调度任务到不同的处理单元&#xff0c;负载均衡可以提高系统的整体性能&#xff0c;减少延迟&#xff0c;并提高资源利用率。在实时 Linux 系统中&#xff0c;负载均衡尤为重要&#xff0c…

bash的特性-命令和文件自动补全

一、前言在 Linux Shell 编程和日常使用中&#xff0c;Bash 的自动补全功能 是一个非常强大且实用的特性。它不仅可以节省输入时间&#xff0c;还能有效减少拼写错误&#xff0c;提升命令执行效率。本文将带你全面了解 Bash 的自动补全机制&#xff0c;包括&#xff1a;✅ 命令…

Ubuntu系统 系统盘和数据盘扩容具体操作

Linux磁盘配置和需求&#xff0c;以下是完整的操作方案&#xff1a; 可以看到系统盘vda3 还有48GB 数据盘则是还有512GB没有挂载使用&#xff0c;下面是完成数据扩容的具体操作 一、完成系统盘扩容&#xff08;使用98GB空间&#xff09; # 1. 扩展逻辑卷&#xff08;LVM架构&am…

从0到1学Pandas(七):Pandas 在机器学习中的应用

目录一、数据预处理1.1 特征提取1.2 数据标准化与归一化1.3 特征编码二、特征工程2.1 特征选择​2.2 特征组合与衍生​2.3 缺失值处理策略​三、模型训练与评估3.1 数据集划分3.2 模型训练与预测3.3 模型评估与调优四、Pipeline 构建4.1 自动化工作流4.2 模型部署与应用4.3 模型…

LangChain和LangGraph 里面的 `create_react_agent`有什么不同

这两个函数虽然名称相同&#xff0c;但来自不同的库&#xff08;LangChain 和 LangGraph&#xff09;&#xff0c;它们在实现和使用上有一些关键区别&#xff1a; 主要区别特性LangChain 的 create_react_agentLangGraph 的 create_react_agent所属库LangChainLangGraph设计目的…

PostgreSQL 与 Oracle 数据库字段类型的详细对比

一、数值类型对比数据类型OraclePostgreSQL说明整数NUMBER(p,0)SMALLINT/INT/BIGINTOracle 统一用 NUMBER&#xff0c;PG 区分精度范围浮点数BINARY_FLOATREAL单精度浮点双精度浮点BINARY_DOUBLEDOUBLE PRECISION双精度浮点高精度小数NUMBER(p,s)NUMERIC(p,s)精确数值存储自增序…

JVM 性能调优实战:让系统性能 “飞” 起来的核心策略

在 Java 应用的生命周期中&#xff0c;性能问题如同隐藏的 “暗礁”—— 初期可能不显眼&#xff0c;但随着用户量增长和业务复杂度提升&#xff0c;微小的性能损耗会被无限放大&#xff0c;最终导致系统响应迟缓、频繁卡顿甚至崩溃。JVM 性能调优的目标&#xff0c;就是通过优…

Android Handler 完全指南

在 Android 开发中&#xff0c;Handler 是线程通信的核心工具 —— 当你在子线程下载图片后需要更新 UI&#xff0c;当你在 TCP 连接中收到数据需要通知界面&#xff0c;当你需要延迟执行某个任务时&#xff0c;都会用到 Handler。这个看似简单的类&#xff0c;却蕴含着 Androi…

梳理Ego-Planner模式下5通道、6通道与无人机模式的关系

Copilot said: 你需要梳理Ego-Planner模式下5通道、6通道与无人机模式的关系&#xff0c;以及轨迹跟随、紧急情况和人工接管的流程。下面结合你的描述和三张图片&#xff0c;对核心逻辑进行总结和整理&#xff1a; --- ## 一、状态组合与对应模式&#xff08;见图1&#xff09;…

odbc和jdbc什么区别

ODBC 和 JDBC 都是用于连接和操作数据库的标准接口&#xff0c;但它们分别面向不同的编程语言和平台。下面是它们的区别与对比&#xff0c;帮助你理解它们的用途和适用场景。&#x1f4ca; 一、基本概念对比特性ODBC&#xff08;Open Database Connectivity&#xff09;JDBC&am…