了解這個由 Next.js 提供的強大技術,用於在 Next.js 應用程序中創建 API 端點。

除了創建頁面路由(意味著頁面作為 Web 頁面提供給瀏覽器),Next.js 還可以創建API 路由

這是一個非常有趣的功能,因為這意味著 Next.js 可以用於創建存儲在 Next.js 中並通過 fetch 請求傳輸 JSON 的數據的前端。

API 路由位於 /pages/api/ 文件夾下,並且與 /api 端點相映射。

這個功能在創建應用程序時非常有用。

在這些路由中,我們編寫的是 Node.js 代碼(而不是 React 代碼)。這是一個範式轉變,你從前端轉向後端,但非常平滑。

假如你有一個 /pages/api/comments.js 文件,它的目標是以 JSON 的形式返回博客文章的評論。

假如你有一個存儲在 comments.json 文件中的評論列表:

[
  {
    "comment": "第一條"
  },
  {
    "comment": "好文章"
  }
]

下面是一個示例代碼,返回評論列表給客戶端:

import comments from './comments.json'

export default (req, res) => {
  res.status(200).json(comments)
}

它將在 /api/comments URL 上聽取 GET 請求,你可以使用瀏覽器來調用它:

API 路由還可以像頁面一樣使用動態路由,使用 [] 語法創建動態 API 路由,例如 /pages/api/comments/[id].js,將檢索特定於某個文章 id 的評論。

[id].js 內,你可以通過在 req.query 對象中查找它來獲取 id 值:

import comments from '../comments.json'

export default (req, res) => {
  res.status(200).json({ post: req.query.id, comments })
}

以下是上述代碼的執行結果:

在動態頁面中,你需要從 next/router 引入 useRouter,然後使用 const router = useRouter() 獲取 router 對象,然後我們就可以使用 router.query.id 來獲取 id 值。

在服務器端,一切都變得更簡單,因為查詢被附加到請求對象上。

如果你發送 POST 請求,所有步驟都是一樣的 - 它們都通過默認導出進行處理。

要將 POST 請求與 GET 和其他 HTTP 方法(PUT、DELETE)區分開,查詢 req.method 的值:

export default (req, res) => {
  switch (req.method) {
    case 'GET':
      //...
      break
    case 'POST':
      //...
      break
    default:
      res.status(405).end() //Method Not Allowed
      break
  }
}

除了我們已經看到的 req.queryreq.method,我們還可以通過引用 req.cookies 獲取 cookie,通過 req.body 獲取請求正文中的內容。

在幕後,這一切都是由 Micro 驅動的,它是一個由 Next.js 建立的非同步 HTTP 微服務的庫。

你可以在我們的 API 路由中使用任何 Micro 中間件來添加更多功能。