json-server 快速搭建介面服務 使用教程

Chiffon1996發表於2024-05-27

json-server 是一款小巧的介面模擬工具,一分鐘內就能搭建一套 Restful 風格的 API,尤其適合前端介面測試使用。
只需指定一個 json 檔案作為 api 的資料來源即可,使用起來非常方便,30 秒入門。
進階操作還支援分頁,排序等操作,非常方便!

開源地址
主頁地址:https://www.npmjs.com/package/json-server
Github專案地址:https://github.com/typicode/json-server

  1. 環境

需要node環境

2.建立一個db.json包含一些資料的檔案

{
  "posts": [
    { "id": 1, "title": "json-server", "author": "typicode" }
  ],
  "comments": [
    { "id": 1, "body": "some comment", "postId": 1 }
  ],
  "profile": { "name": "typicode" }
}

3.啟動 json-server 介面伺服器

# 快速建立
json-server db.json

# 配置引數
json-server db.json --watch --port 3000

4.瀏覽器訪問 http://localhost:3000/posts/1,你會得到

{ "id": 1, "title": "json-server", "author": "typicode" }

補充

如果發出 POST、PUT、PATCH 或 DELETE 請求,更改將自動安全地儲存到 db.json 檔案中。

路由進階

根據之前的 db.json 檔案,這裡是所有的預設路由。

路由形式一

方法 路由
GET /posts
GET /posts/1
POST /posts
PUT /posts/1
PATCH /posts/1
DELETE /posts/1

路由形式二

方法 路由
GET /profile
POST /profile
PUT /profile
PATCH /profile

篩選

使用 . 訪問篩選

  • GET /posts?title=json-server&author=typicode
  • GET /posts?id=1&id=2
  • GET /comments?author.name=typicode

分頁

使用 _page 和可選地 _limit 對返回的資料進行分頁。

  • GET /posts?_page=7
  • GET /posts?_page=7&_limit=20

預設返回 10 項

排序

新增 _sort_order(預設升序)

  • GET /posts?_sort=views&_order=asc
  • GET /posts/1/comments?_sort=votes&_order=asc

對於多個欄位,請使用以下格式:

  • GET /posts?_sort=user,views&_order=desc,asc

切片(分頁)

新增 _start_end_limit

  • GET /posts?_start=20&_end=30
  • GET /posts/1/comments?_start=20&_end=30
  • GET /posts/1/comments?_start=20&_limit=10

Array.slice 完全一樣工作(即 _start 開始 _end 結束)

特殊符號

新增 _gte_lte 獲取範圍

  • GET /posts?views_gte=10&views_lte=20

新增 _ne 以排除值

  • GET /posts?id_ne=1

新增 _like 到過濾器(支援正規表示式)

  • GET /posts?title_like=server

全文搜尋

新增 q

  • GET /posts?q=internet

關係

要包含子資源,請新增 _embed

  • GET /posts?_embed=comments
  • GET /posts/1?_embed=comments

要包含父資源,請新增 _expand

  • GET /comments?_expand=post
  • GET /comments/1?_expand=post

獲取或建立巢狀資源(預設為一級)

  • GET /posts/1/comments
  • POST /posts/1/comments

資料庫

  • GET /db

主頁

返回預設索引檔案或服務 ./public 目錄

  • GET /

附加功能

靜態檔案伺服器

您可以使用 JSON Server 為您的 HTML、JS 和 CSS 提供服務,只需建立一個 ./public 目錄或用於 --static 設定不同的靜態檔案目錄。

mkdir public
echo 'hello world' > public/index.html
json-server db.json
json-server db.json --static ./some-other-dir

替換埠

您可以使用以下--port標誌在其他埠上啟動 JSON Server :

 json-server --watch db.json --port 3004

支援跨域

您可以使用 CORS 和 JSONP 從任何地方訪問您模擬的 API 介面。

遠端模式

您可以載入遠端模式。

$ json-server http://example.com/file.json
$ json-server http://jsonplaceholder.typicode.com/db

生成隨機資料

使用 JS 而不是 JSON 檔案,您可以透過程式設計方式建立資料。

// index.js
module.exports = () => {
  const data = { users: [] }
  // 建立 1000 個使用者資訊
  for (let i = 0; i < 1000; i++) {
    data.users.push({ id: i, name: `user${i}` })
  }
  return data
}
$ json-server index.js

提示:使用Faker、Casual、Chance或JSON Schema Faker 等模組。

新增自定義路由

建立一個routes.json檔案。注意每條路線都以/.

{
  "/api/*": "/$1",
  "/:resource/:id/show": "/:resource/:id",
  "/posts/:category": "/posts?category=:category",
  "/articles\\?id=:id": "/posts/:id"
}
使用--routes選項啟動 JSON 伺服器。

json-server db.json --routes routes.json
現在您可以使用其他路線訪問資源。

/api/posts # → /posts
/api/posts/1  # → /posts/1
/posts/1/show # → /posts/1
/posts/javascript # → /posts?category=javascript
/articles?id=1 # → /posts/1
### 新增中介軟體
您可以使用以下--middlewares選項從 CLI 新增中介軟體:

// hello.js
module.exports = (req, res, next) => {
  res.header('X-Hello', 'World')
  next()
}
json-server db.json --middlewares ./hello.js
json-server db.json --middlewares ./first.js ./second.js

命令列使用

json-server [options]

Options:
  --config, -c       Path to config file           [default: "json-server.json"]
  --port, -p         Set port                                    [default: 3000]
  --host, -H         Set host                             [default: "localhost"]
  --watch, -w        Watch file(s)                                     [boolean]
  --routes, -r       Path to routes file
  --middlewares, -m  Paths to middleware files                           [array]
  --static, -s       Set static files directory
  --read-only, --ro  Allow only GET requests                           [boolean]
  --no-cors, --nc    Disable Cross-Origin Resource Sharing             [boolean]
  --no-gzip, --ng    Disable GZIP Content-Encoding                     [boolean]
  --snapshots, -S    Set snapshots directory                      [default: "."]
  --delay, -d        Add delay to responses (ms)
  --id, -i           Set database id property (e.g. _id)         [default: "id"]
  --foreignKeySuffix, --fks  Set foreign key suffix, (e.g. _id as in post_id)
                                                                 [default: "Id"]
  --quiet, -q        Suppress log messages from output                 [boolean]
  --help, -h         Show help                                         [boolean]
  --version, -v      Show version number                               [boolean]

Examples:
  json-server db.json
  json-server file.js
  json-server http://example.com/db.json

https://github.com/typicode/json-server
您還可以在json-server.json配置檔案中設定選項。

{
  "port": 3000
}

模組

如果您需要新增身份驗證、驗證或任何行為,您可以將專案作為模組與其他 Express 中介軟體結合使用。

簡單的例子
$ npm install json-server --save-dev
// server.js
const jsonServer = require('json-server')
const server = jsonServer.create()
const router = jsonServer.router('db.json')
const middlewares = jsonServer.defaults()

server.use(middlewares)
server.use(router)
server.listen(3000, () => {
  console.log('JSON Server is running')
})
$ node server.js
您提供給jsonServer.router函式的路徑是相對於您啟動節點程序的目錄的。如果從另一個目錄執行上述程式碼,最好使用絕對路徑:

const path = require('path')
const router = jsonServer.router(path.join(__dirname, 'db.json'))
對於記憶體資料庫,只需將物件傳遞給jsonServer.router().

另請注意,jsonServer.router()它可用於現有的 Express 專案。

自定義路由示例

假設您想要一個回顯查詢引數的路由和另一個在建立的每個資源上設定時間戳的路由。

const jsonServer = require('json-server')
const server = jsonServer.create()
const router = jsonServer.router('db.json')
const middlewares = jsonServer.defaults()

// 設定預設中介軟體(記錄器、靜態、cors 和無快取)
server.use(middlewares)

// 寫在自定義路由之前
server.get('/echo', (req, res) => {
  res.jsonp(req.query)
})

// 要處理 POST、PUT 和 PATCH,您需要使用 body-parser
// 您可以使用 JSON Server
server.use(jsonServer.bodyParser)
server.use((req, res, next) => {
  if (req.method === 'POST') {
    req.body.createdAt = Date.now()
  }
  // 繼續到 JSON Server 路由器
  next()
})

// 使用預設路由器
server.use(router)
server.listen(3000, () => {
  console.log('JSON Server is running')
})
### 訪問控制示例
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)) { // 在此處新增您的授權邏輯
   next() // 繼續到 JSON Server 路由器
 } else {
   res.sendStatus(401)
 }
})
server.use(router)
server.listen(3000, () => {
  console.log('JSON Server is running')
})

自定義輸出示例

要修改響應,請覆蓋router.render方法:

// 在這個例子中,返回的資源將被包裝在一個 body 屬性
router.render = (req, res) => {
  res.jsonp({
    body: res.locals.data
  })
}
您可以為響應設定自己的狀態程式碼:

// 在這個例子中,我們模擬了一個伺服器端錯誤響應
router.render = (req, res) => {
  res.status(500).jsonp({
    error: "error message here"
  })
}

重寫器示例

要新增重寫規則,請使用jsonServer.rewriter():

// 寫在 server.use(router) 之前
server.use(jsonServer.rewriter({
  '/api/*': '/$1',
  '/blog/:resource/:id/show': '/:resource/:id'
}))
在另一個端點上掛載 JSON 伺服器示例
或者,您也可以將路由器安裝在/api.

server.use('/api', router)
API
jsonServer.create()

返回一個 Express 伺服器。

jsonServer.defaults([options])

返回 JSON 伺服器使用的中介軟體。

選項

static 靜態檔案的路徑
logger 啟用記錄器中介軟體(預設值:true)
bodyParser 啟用 body-parser 中介軟體(預設值:true)
noCors 禁用 CORS(預設值:false)
readOnly 只接受 GET 請求(預設值:false)
jsonServer.router([path|object])

返回 JSON 伺服器路由器。

相關文章