Koa2路由及koa腳手架使用入門(mén)詳解
路由是什么
路由(routing)是指分組從源到目的地時(shí),決定端到端路徑的網(wǎng)絡(luò)范圍的進(jìn)程。
路由是 根據(jù)不同的 url 地址 展示 不同的內(nèi)容或頁(yè)面。
比如你請(qǐng)求了某個(gè)網(wǎng)站的用戶(hù)列表的URL他就會(huì)去執(zhí)行查詢(xún)用戶(hù)列表,并返回用戶(hù)列表數(shù)據(jù)。
如果你請(qǐng)求了特定用戶(hù)的接口的URL,他就會(huì)查詢(xún)特定用戶(hù),并返回給你特定用戶(hù)的數(shù)據(jù)。
路由決定了不同URL是如何被不同地執(zhí)行的
在Koa中,路由的本質(zhì)是中間件
為什么要用路由?
- 如果沒(méi)有路由,會(huì)怎么樣?
- 路由存在的意義是什么?
如果沒(méi)有路由
- 所有請(qǐng)求都做了相同的事
- 所有請(qǐng)求都會(huì)返回相同的結(jié)果
路由存在的意義
- 處理不同的URL
- 處理不同的HTTP方法
- 解析URL上的參數(shù)
koa中使用路由
自定義項(xiàng)目中使用koa路由
安裝
npm install koa-router
新建服務(wù)器
const koa = require('koa');// 引入koa const Router = require('koa-router'); //配置路由 ,ctx 上下文context ,包含了request和response等信息 var router = new Router(); router.get('/',async (ctx)=>{ ctx.body = '首頁(yè)'; //相當(dāng)于 res.writeHead(); res.end(); }).get('/news',async (ctx)=>{ ctx.body = '這是一個(gè)新聞頁(yè)面'; }); const app = new koa();//實(shí)例化koa app.use(router.routes()); //啟動(dòng)路由 app.use(router.allowedMethods());//官方配置
獲取get
傳值
const koa = require('koa'); var router = require('koa-router')(); var app = new koa(); router.get('/',async (ctx)=>{ ctx.body = '首頁(yè)'; }); router.get('/news',async (ctx)=>{ ctx.body = '新聞列表頁(yè)面'; }); //獲取get傳值 router.get('/newscontent',async(ctx)=>{ //從ctx中讀取get值 console.log(ctx.query); //獲取的是格式化的對(duì)象,例{id:'123'} console.log(ctx.querystring); //獲取的是url的字符串 ,例:'id=123' console.log(ctx.request); //獲取請(qǐng)求相關(guān)的信息,包括method,url,header等信息 ctx.body = '新聞詳情'; }); //動(dòng)態(tài)路由 router.get('/news/:params',async(ctx)=>{ //aid 為自定義參數(shù)名,可以通過(guò)ctx.params訪(fǎng)問(wèn) //如果有多個(gè)動(dòng)態(tài)傳值,則可以寫(xiě)成 '/news/:params1/:params2'的形式 ctx.body = ctx.params; }); app.use(router.routes()); //啟動(dòng)路由 app.use(router.allowedMethods()); //官方配置,請(qǐng)求錯(cuò)誤的時(shí)候返回一個(gè)狀態(tài) app.listen(3000);
使用 koa 腳手架(koa-generator)創(chuàng)建項(xiàng)目中使用koa路由
如果您使用 koa 腳手架(koa-generator)已經(jīng)創(chuàng)建好了項(xiàng)目你,那么使用路由會(huì)非常簡(jiǎn)單。
如果不清楚如何使用koa腳手架,請(qǐng)參考:
koa2項(xiàng)目目錄詳解:
. +-- bin | +-- www // 項(xiàng)目啟動(dòng)必備文件,配置端口等服務(wù)信息 +-- node_modules // 項(xiàng)目依賴(lài),安裝的所有模塊都會(huì)在這個(gè)文件夾下 +-- public // 存放靜態(tài)文件,如樣式、圖片等 | +-- images // 圖片 | +-- javascript // js文件 | +-- stylesheets // 樣式文件 +-- routers // 存放路由文件,如果前后端分離的話(huà)只用來(lái)書(shū)寫(xiě)api接口使用 | +-- index.js | +-- user.js +-- views // 存放存放模板文件,就是前端頁(yè)面,如果后臺(tái)只是提供api的話(huà),這個(gè)就是備用 | +-- error.pug | +-- index.pug | +-- layout.pug +-- app.js // 主入口文件 +-- package.json // 存儲(chǔ)項(xiàng)目名、描述、作者、依賴(lài)等等信息 +-- package-lock.json // 存儲(chǔ)項(xiàng)目依賴(lài)的版本信息,確保項(xiàng)目?jī)?nèi)的每個(gè)人安裝的版本一致
打開(kāi) routes\index.js
,j即可查看創(chuàng)建好的路由文件。
var router = require('koa-router')(); // 引入路由插件 // 定義路由內(nèi)容 我們只需要操作這里即可 router.get('/', function *(next) { yield this.render('index', { title: 'Hello World Koa!' }); }); router.get('/foo', function *(next) { yield this.render('index', { title: 'Hello World foo!' }); }); router.post('/post1', function *(next) { yield this.render('index', { title: 'Hello World foo!' }); }); //獲取get傳值 router.get('/newscontent',async(ctx)=>{ //從ctx中讀取get值 console.log(ctx.query); //獲取的是格式化的對(duì)象,例{id:'123'} console.log(ctx.querystring); //獲取的是url的字符串 ,例:'id=123' console.log(ctx.request); //獲取請(qǐng)求相關(guān)的信息,包括method,url,header等信息 ctx.body = '新聞詳情'; }); //動(dòng)態(tài)路由 router.get('/news/:params',async(ctx)=>{ //aid 為自定義參數(shù)名,可以通過(guò)ctx.params訪(fǎng)問(wèn) //如果有多個(gè)動(dòng)態(tài)傳值,則可以寫(xiě)成 '/news/:params1/:params2'的形式 ctx.body = ctx.params; }); module.exports = router; // 導(dǎo)出路由
app.js中路由展示
注意:這里,只展示有關(guān)路由代碼,還有其他代碼,省略了不少:
var app = require('koa')(); ... var index = require('./routes/index'); var users = require('./routes/users'); // 自定義的路由模塊 : 用戶(hù)模塊 users ... // routes definition app.use(index.routes(), index.allowedMethods()); //啟動(dòng)路由 app.use(users.routes(), users.allowedMethods()); //官方配置,請(qǐng)求錯(cuò)誤的時(shí)候返回一個(gè)狀態(tài) ... module.exports = app;
users.js
var router = require('koa-router')(); // 引入路由插件 router.prefix('/users'); // 定義路由前綴 // 定義路由內(nèi)容 我們只需要操作這里即可 router.get('/', function *(next) { this.body = 'this is a users response!'; }); router.get('/bar', function *(next) { this.body = 'this is a users/bar response!'; }); module.exports = router; // 導(dǎo)出路由
總結(jié)
路由處理不同的URL
我們要做什么事情,根據(jù)路由來(lái)決定。我們通過(guò)路由就找到了這個(gè)地方,去做相應(yīng)的業(yè)務(wù)邏輯的處理好。
就是處理不同的HTTP方法
因?yàn)槲覀冊(cè)谡?qǐng)求一個(gè)地方的時(shí)候,可能你這個(gè)請(qǐng)求方式會(huì)有很多種,比如get請(qǐng)求、post 請(qǐng)求。每一種請(qǐng)求的方法,它的所代表的意義又不一樣。所以我們?yōu)榱藚^(qū)分不同的請(qǐng)求方法,我們也得去使用路由。
為了解析URL上面的參數(shù)
我們?cè)谌プ銮昂蠖朔蛛x開(kāi)發(fā),需要通過(guò)http請(qǐng)求,并且請(qǐng)求一個(gè)地址,把我們要請(qǐng)求的參數(shù)傳給服務(wù)器端。
服務(wù)器端根據(jù)我們傳的參數(shù)來(lái)決定返回什么樣的結(jié)果。
以上三點(diǎn)就說(shuō)明了路由存在的意義,所以我們?cè)陧?xiàng)目開(kāi)發(fā)的過(guò)程中,一定要去區(qū)分好路由,以及對(duì)路由要有一個(gè)合理的規(guī)劃。
推薦使用 koa 腳手架(koa-generator
)創(chuàng)建項(xiàng)目。,自己創(chuàng)建項(xiàng)目的話(huà),需要安裝很多包,很繁瑣,一不小心,就會(huì)出問(wèn)題。
參考文檔 https://koa.bootcss.com/index.html
以上就是Koa2路由及koa腳手架使用入門(mén)詳解的詳細(xì)內(nèi)容,更多關(guān)于Koa2路由koa腳手架的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解Node.js access_token的獲取、存儲(chǔ)及更新
本篇文章主要介紹了Node.js access_token的獲取、存儲(chǔ)及更新 ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06node.js如何自定義實(shí)現(xiàn)一個(gè)EventEmitter
我們了解到,Node采用了事件驅(qū)動(dòng)機(jī)制,而EventEmitter就是Node實(shí)現(xiàn)事件驅(qū)動(dòng)的基礎(chǔ),本文主要介紹了node.js自定義實(shí)現(xiàn)EventEmitter,感興趣的可以了解一下2021-07-07nodejs前端自動(dòng)化構(gòu)建環(huán)境的搭建
本文這里給大家介紹的是nodejs中前端自動(dòng)化構(gòu)建環(huán)境的搭建方法,非常的細(xì)致全面,有需要的小伙伴可以參考下2017-07-07