react框架next.js學(xué)習(xí)之API?路由篇詳解
正文
next.js 作為最熱門的 react 框架,不過(guò)這么久了好像國(guó)內(nèi)使用率一直不太高。最近在研究做個(gè)小項(xiàng)目正好做下筆記,有興趣的可以一起來(lái)學(xué)習(xí)。
next.js 首頁(yè)標(biāo)榜的 12 個(gè)特性之一就是 API routes,簡(jiǎn)單的說(shuō)就是可以 next.js 直接寫 node 代碼作為后端服務(wù)來(lái)運(yùn)行。因此我們可以直接使用 next.js 直接維護(hù)一個(gè)全棧項(xiàng)目,聽起來(lái)很香的樣子。
使用方式
next.js 中使用文件路徑作為路由,所以在 API routes 中也是一樣,一般的頁(yè)面文件我們會(huì)放在 pages 下,而 API routes 文件我們則需要放在 pages/api 下,emmm,其實(shí)我覺得這個(gè)設(shè)計(jì)有點(diǎn)奇怪,為啥不是在外層增加一個(gè) server 或者 api 的文件夾呢,放在 pages 下面感覺怪怪的。而請(qǐng)求時(shí),需要請(qǐng)求對(duì)應(yīng)的 /api/ 下的文件地址,emmm,好吧,真的挺奇怪的。
所以我們要新增一個(gè) API 只需要在 pages/api/ 目錄下新建一個(gè)文件即可。
API 路由匹配
而 API 的文件命名有三種方式:
pages/api/route.js
pages/api/route/[param].js
pages/api/route/[...slug].js
第一種很好理解,就是會(huì)處理發(fā)送到 /api/route 的請(qǐng)求,第二種會(huì)接受來(lái)自 /api/route/xxxx 的請(qǐng)求,并將 xxxx 作為參數(shù)放到 param 中,而第三種則是會(huì)接收所有的到 /api/route/ 下的請(qǐng)求,比如 /api/route/a/b/c 等。
當(dāng)請(qǐng)求過(guò)來(lái)進(jìn)行匹配時(shí), next.js 將會(huì)按照從上到下的優(yōu)先級(jí)來(lái)匹配應(yīng)該處理的路由,比如上面三個(gè)文件同時(shí)存在,那么發(fā)送到 /api/route 的請(qǐng)求將會(huì)從被第一個(gè)文件所處理,而 /api/route/a 的請(qǐng)求會(huì)被第二個(gè)文件所處理,剩余的請(qǐng)求才會(huì)進(jìn)入第三個(gè)文件中處理。
API 處理
而在處理文件中,會(huì)調(diào)用默認(rèn)的導(dǎo)出函數(shù)來(lái)處理請(qǐng)求:
export default function handler(req, res) {
res.status(200).json({ foo: 'bar' });
}
如上代碼表示請(qǐng)求的響應(yīng)體 http 狀態(tài)碼為 200,響應(yīng)體中是一段 json。
除了 nodejs 原生中包含的一些屬性和方法外,next 還在 res 中擴(kuò)展了以下幾個(gè)常用的方法:
res.status(code)響應(yīng)的http狀態(tài)碼res.json(body) json響應(yīng)體res.send(body)其它響應(yīng)體,可以是string、object、Bufferres.redirect([status,] path)重定向res.revalidate(urlPath)重新進(jìn)行校驗(yàn)
而在 req 中則擴(kuò)展了以下幾個(gè)常用屬性:
req.cookies請(qǐng)求包含的cookiesreq.query請(qǐng)求的query參數(shù)req.body請(qǐng)求體
是不是很熟悉,沒錯(cuò)就是 express.js 的一些功能。
API 配置
除了 export 默認(rèn)的處理函數(shù)處理請(qǐng)求外,還可 export 一個(gè) config 對(duì)象來(lái)配置:
export const config = {
api: {
// 請(qǐng)求體處理
bodyParser: {
sizeLimit: '1mb'
},
// 響應(yīng)體的大小限制
responseLimit: '8mb',
// 用于指定請(qǐng)求是否被外部服務(wù)處理,這個(gè)暫時(shí)還沒搞清楚是怎么工作的,等研究完了再來(lái)更新
externalResolver: true
}
};
邊緣計(jì)算支持
此外,next.js 的 API routes 還支持最近很火的邊緣計(jì)算,不過(guò)邊緣計(jì)算的運(yùn)行時(shí)和 node 運(yùn)行時(shí)差異較大,需要注意改動(dòng)。由于暫時(shí)對(duì)這方面沒有研究,不做過(guò)多深入。
自定義 API
除了默認(rèn)的請(qǐng)求處理,還可以借助外部 server 來(lái)處理請(qǐng)求,比如 graphql:
import { createServer } from '@graphql-yoga/node';
const typeDefs = /* GraphQL */ `
type Query {
users: [User!]!
}
type User {
name: String
}
`;
const resolvers = {
Query: {
users() {
return [{ name: 'Nextjs' }];
}
}
};
const server = createServer({
schema: {
typeDefs,
resolvers
},
endpoint: '/api/graphql'
});
export default server;
注意點(diǎn)
另外需要注意的是,如果配置了 pageExtensions,API 文件的命名也會(huì)受影響。
還有如果同時(shí)存在 pages/api/route/[param].js 和 pages/api/route/[param1].js 不知道會(huì)發(fā)什么什么,回頭有空試試。
總結(jié)
使用 next.js 的 API routes,我們可以直接在項(xiàng)目中編寫 nodejs 后端代碼,輕松完成全棧開發(fā)。
再多說(shuō)幾句,經(jīng)過(guò)這么多年的發(fā)展,前后端終于分離了,然而最近幾年,前端又開始干起后端的活,夢(mèng)回 php、jsp。古人云的好:風(fēng)水輪流轉(zhuǎn),前后不分家。
以上就是react框架next.js學(xué)習(xí)之API 路由篇詳解的詳細(xì)內(nèi)容,更多關(guān)于react框架next.js API路由的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
react執(zhí)行【npx create-react-app my-app】出現(xiàn)常見錯(cuò)誤的解決辦法
文章主要介紹了在使用npx創(chuàng)建React應(yīng)用時(shí)可能遇到的幾種常見錯(cuò)誤及其解決方法,包括缺少依賴、網(wǎng)絡(luò)問題和npx解析錯(cuò)誤等,并提供了相應(yīng)的解決措施,此外,還提到了使用騰訊云云產(chǎn)品來(lái)支持React應(yīng)用開發(fā)2024-11-11
詳解React??App.js?文件的結(jié)構(gòu)和作用
在React應(yīng)用中,App.js文件通常是項(xiàng)目的根組件文件,它負(fù)責(zé)組織和渲染其他組件,是應(yīng)用的核心部分,本文將詳細(xì)介紹App.js文件的結(jié)構(gòu)、作用和最佳實(shí)踐,感興趣的朋友跟隨小編一起看看吧2024-08-08
react源碼層分析協(xié)調(diào)與調(diào)度
本文主要介紹了深入理解React協(xié)調(diào)與調(diào)度(Scheduler)原理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-10-10
手把手教您實(shí)現(xiàn)react異步加載高階組件
這篇文章主要介紹了手把手教您實(shí)現(xiàn)react異步加載高階組件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
一百多行代碼實(shí)現(xiàn)react拖拽hooks
這篇文章主要介紹了一百多行代碼實(shí)現(xiàn)react拖拽hooks,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03

