JSON-Server 是一个 Node 模块,运行 Express 服务器,你可以指定一个 json 文件作为 api 的数据源。
npm install -g json-server
json-server
可以直接把一个json
文件托管成一个具备全RESTful
风格的API
,并支持跨域、jsonp
、路由订制、数据快照保存等功能的 web 服务器。
json在线编辑器
http://www.ab173.com/json/jsoneditoronline.php
db.json文件的内容:
{ "posts": [ { "id": 1, "title": "json-server", "author": "typicode" } ], "comments": [ { "id": 1, "body": "some comment", "postId": 1 } ], "profile": { "name": "typicode" } }
例如以下命令,把db.json
文件托管成一个 web 服务。
$ json-server --watch --port 53000 db.json
输出类似以下内容,说明启动成功。
\{^_^}/ hi! Loading db.json Done Resources http://localhost:53000/course Home http://localhost:53000 Type s + enter at any time to create a snapshot of the database Watching...
此时,你可以打开你的浏览器,然后输入:http://localhost:53000/course
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 | 显示版本号 | [布尔] |
$ json-server --watch -c ./jsonserver.json $ json-server --watch app.js $ json-server db.json json-server --watch -port 8888 db.json
例如启动json-server的命令:json-server --watch app.js
是把一个js文件返回的数据托管成web服务。
mockjs使用方法
https://www.jianshu.com/p/5dfa9f0bb11e
https://www.jianshu.com/p/f3adb1aab09e
app.js配合mockjs库可以很方便的进行生成模拟数据。
Mock.mock('地址',{ "dataname|rule":{"对应的值"} }) //说明:地址就是我们通过ajax获取数据时候填写的地址,这里填写的地址可以是任意不存在的地址,第二个参数是我们要模拟的数据,以及相应的规则。
// 用mockjs模拟生成数据 var Mock = require('mockjs'); module.exports = () => { // 使用 Mock var data = Mock.mock({ 'course|227': [ { // 属性 id 是一个自增数,起始值为 1,每次增 1 'id|+1': 1000, course_name: '@ctitle(5,10)', autor: '@cname', college: '@ctitle(6)', 'category_Id|1-6': 1 } ], 'course_category|6': [ { "id|+1": 1, "pid": -1, cName: '@ctitle(4)' } ] }); // 返回的data会作为json-server的数据 return data; };
Mock示例:
Mock.mock('https://www.test.com',{ "userInfo|4":[{ //生成|num个如下格式名字的数据 "id|+1":1, //数字从当前数开始后续依次加一 "name":"@cname", //名字为随机中文名字 "ago|18-28":25, //年龄为18-28之间的随机数字 "sex|1":["男","女"], //性别是数组中的一个,随机的 "job|1":["web","UI","python","php"] //工作是数组中的一个 }] }) //注意: //对于通过Random属性而来的一些随机数据-比如随机生成图片,使用方式如下: Mock.mock('http://www.test.com',{ "ListInfo|5":[{ "img":Mock.Random.image('200x100') }] }); //这里的图片数据就是随机生成的,只是大小被指定为200X100了
json-server
为提供了GET
,POST
, PUT
, PATCH
,DELETE
等请求的API,分别对应数据中的所有类型的实体。
# 获取所有的课程信息 GET /course # 获取id=1001的课程信息 GET /course/1001 # 添加课程信息,请求body中必须包含course的属性数据,json-server自动保存。 POST /course # 修改课程,请求body中必须包含course的属性数据 PUT /course/1 PATCH /course/1 # 删除课程信息 DELETE /course/1 # 获取具体课程信息id=1001 GET /course/1001
当然你可以自定义路由:
$ json-server --watch --routes route.json db.json
route.json
文件
{ "/api/*": "/$1", // /api/course <==> /course "/:resource/:id/show": "/:resource/:id", "/posts/:category": "/posts?category=:category", "/articles\\?id=:id": "/posts/:id" }
通过命令行配置路由、数据文件、监控等会让命令变的很长,而且容易敲错,可以把命令写到npm的scripts中,但是依然配置不方便。
json-server允许我们把所有的配置放到一个配置文件中,这个配置文件默认json-server.json
;
例如:
{ "port": 53000, "watch": true, "static": "./public", "read-only": false, "no-cors": false, "no-gzip": false, "routes": "route.json" }
使用配置文件启动json-server:
# 默认使用:json-server.json配置文件 $ json-server --watch app.js # 指定配置文件 $ json-server --watch -c jserver.json db.json
查询数据,可以额外提供
GET /posts?title=json-server&author=typicode GET /posts?id=1&id=2 # 可以用 . 访问更深层的属性。 GET /comments?author.name=typicode
还可以使用一些判断条件作为过滤查询的辅助。
GET /posts?views_gte=10&views_lte=20
可以用的拼接条件为:
_gte
: 大于等于_lte
: 小于等于_ne
: 不等于_like
: 包含GET /posts?id_ne=1 GET /posts?id_lte=100 GET /posts?title_like=server
默认后台处理分页参数为: _page
第几页, _limit
一页多少条。
GET /posts?_page=7 GET /posts?_page=7&_limit=20
默认一页10条。
后台会返回总条数,总条数的数据在响应头:X-Total-Count
中。
_sort
设定排序的字段_order
设定排序的方式(默认升序)GET /posts?_sort=views&_order=asc GET /posts/1/comments?_sort=votes&_order=asc
支持多个字段排序:
GET /posts?_sort=user,views&_order=desc,asc
GET /posts?_start=20&_end=30 GET /posts/1/comments?_start=20&_end=30 GET /posts/1/comments?_start=20&_limit=10
可以通过q
参数进行全文检索,例如:GET /posts?q=internet
包含children的对象, 添加_embed
GET /posts?_embed=comments GET /posts/1?_embed=comments
包含 parent 的对象, 添加_expand
GET /comments?_expand=post GET /comments/1?_expand=post
json-server
本身就是依赖express开发而来,可以进行深度定制。细节就不展开,具体详情请参考官网。
const jsonServer = require('json-server') const server = jsonServer.create() const router = jsonServer.router('db.json') const middlewares = jsonServer.defaults() server.use(middlewares) server.get('/echo', (req, res) => { res.jsonp(req.query) }) server.use(jsonServer.bodyParser) server.use((req, res, next) => { if (req.method === 'POST') { req.body.createdAt = Date.now() } next() }) server.use(router) server.listen(3000, () => { console.log('JSON Server is running') })
router.render = (req, res) => { res.jsonp({ body: res.locals.data }) }
const jsonServer = require('json-server') const server = jsonServer.create() const router = jsonServer.router('db.json') const middlewares = jsonServer.defaults() server.use(middlewares) server.use((req, res, next) => { if (isAuthorized(req)) { // add your authorization logic here next() // continue to JSON Server router } else { res.sendStatus(401) } }) server.use(router) server.listen(3000, () => { console.log('JSON Server is running') })