转载:json-server 详解 - FlyDragon - 博客园
JSON-Server 是一个 Node 模块,运行 Express 服务器,你可以指定一个 json 文件作为 api 的数据源。
# 安装 json-server
1 | npm install -g json-server |
# 启动 json-server
json-server
可以直接把一个 json
文件托管成一个具备全 RESTful
风格的 API
, 并支持跨域、 jsonp
、路由订制、数据快照保存等功能的 web 服务器。
db.json 文件的内容:
1 | { |
例如以下命令,把 db.json
文件托管成一个 web 服务。
1 | $ json-server --watch --port 53000 db.json |
输出类似以下内容,说明启动成功。
1 | \{^_^}/ hi! |
此时,你可以打开你的浏览器,然后输入:http://localhost:53000/course
# json-server 的相关启动参数
- 语法:
json-server [options] <source>
- 选项列表:
参数 | 简写 | 默认值 | 说明 |
---|---|---|---|
–config | -c | 指定配置文件 | [默认值: “json-server.json”] |
–port | -p | 设置端口 [默认值: 3000] | Number |
–host | -H | 设置域 [默认值: “0.0.0.0”] | String |
–watch | -w | Watch file(s) | 是否监听 |
–routes | -r | 指定自定义路由 | |
–middlewares | -m | 指定中间件 files | [数组] |
–static | -s | Set static files directory | 静态目录,类比:express 的静态目录 |
–readonly | –ro | Allow only GET requests [布尔] | |
–nocors | –nc | Disable Cross-Origin Resource Sharing [布尔] | |
–no | gzip | , --ng Disable GZIP Content-Encoding [布尔] | |
–snapshots | -S | Set snapshots directory [默认值: “.”] | |
–delay | -d | Add delay to responses (ms) | |
–id | -i | Set database id property (e.g. _id) [默认值: “id”] | |
–foreignKeySuffix | – | fks Set foreign key suffix (e.g. _id as in post_id) | [默认值: “Id”] |
–help | -h | 显示帮助信息 | [布尔] |
–version | -v | 显示版本号 | [布尔] |
- source 可以是 json 文件或者 js 文件。实例:
1 | $ json-server --watch -c ./jsonserver.json |
# 动态生成模拟数据
例如启动 json-server 的命令: json-server --watch app.js
是把一个 js 文件返回的数据托管成 web 服务。
app.js 配合 mockjs 库可以很方便的进行生成模拟数据。
1 | // 用mockjs模拟生成数据 |
# 路由
# 默认的路由
json-server
为提供了 GET
, POST
, PUT
, PATCH
, DELETE
等请求的 API, 分别对应数据中的所有类型的实体。
1 | # 获取所有的课程信息 |
# 自定义路由
当然你可以自定义路由:
1 | $ json-server --watch --routes route.json db.json |
route.json
文件
1 | { |
# 自定义配置文件
通过命令行配置路由、数据文件、监控等会让命令变的很长,而且容易敲错,可以把命令写到 npm 的 scripts 中,但是依然配置不方便。
json-server 允许我们把所有的配置放到一个配置文件中,这个配置文件默认 json-server.json
;
例如:
1 | { |
使用配置文件启动 json-server:
1 | # 默认使用:json-server.json配置文件 |
# 过滤查询
查询数据,可以额外提供
1 | GET /posts?title=json-server&author=typicode |
还可以使用一些判断条件作为过滤查询的辅助。
1 | GET /posts?views_gte=10&views_lte=20 |
可以用的拼接条件为:
_gte
: 大于等于_lte
: 小于等于_ne
: 不等于_like
: 包含
1 | GET /posts?id_ne=1 |
# 分页查询
默认后台处理分页参数为: _page
第几页, _limit
一页多少条。
1 | GET /posts?_page=7 |
默认一页 10 条。
后台会返回总条数,总条数的数据在响应头: X-Total-Count
中。
# 排序
- 参数:
_sort
设定排序的字段 - 参数:
_order
设定排序的方式(默认升序)
1 | GET /posts?_sort=views&_order=asc |
支持多个字段排序:
1 | GET /posts?_sort=user,views&_order=desc,asc |
# 任意切片数据
1 | GET /posts?_start=20&_end=30 |
# 全文检索
可以通过 q
参数进行全文检索,例如: GET /posts?q=internet
# 实体关联
# 关联子实体
包含 children 的对象,添加 _embed
1 | GET /posts?_embed=comments |
# 关联父实体
包含 parent 的对象,添加 _expand
1 | GET /comments?_expand=post |
# 其他高级用法
json-server
本身就是依赖 express 开发而来,可以进行深度定制。细节就不展开,具体详情请参考官网。
- 自定义路由
1 | const jsonServer = require('json-server') |
- 自定义输出内容
1 | router.render = (req, res) => { |
- 自定义用户校验
1 | const jsonServer = require('json-server') |