-
框架
- 是一種概念征讲,是對常見功能的封裝扇苞,是整個或部分系統(tǒng)的可重用設計欺殿,表現(xiàn)為一組抽象構件及構件實例間交互的方法,通過制定一種規(guī)則鳖敷,具有約束性脖苏,給定一些Api,可讓開發(fā)人員能夠快速開發(fā)項目的工具定踱,假如你要造一輛馬車棍潘,在沒有框架的情況下,你需要自己去伐木崖媚,去把木頭做成木板亦歉,木棍,然后組成輪子至扰,門鳍徽,等部件,然后組裝起來敢课,但如果你用了框架阶祭,就相當于你有現(xiàn)成的輪子绷杜,門等部件,你只需要組裝一下就可以了
-
Express
基于NodeJs平臺濒募,快速開發(fā)項目的web開發(fā)框架
-
起步
生成項目文件并初始化包管理文件
mkdir myapp && cd myapp && npm init -y
下載express模塊
npm install express -S
創(chuàng)建文件
cd myapp && touch app.js
打開app.js輸入以下代碼
// 引入express模塊 const Express = require('express'); // 實例化Express對象或者const app = express()調用也可以得到實例對象 const app = new Express(); // 注冊路由 app.get('/', (req, res) => { res.end('Hello World'); }) // 啟動服務 app.listen(3000, err => { !err && process.stdout.write('服務啟動成功'); })
-
Express應用生成器
安裝全局命令
npm install express-generator -g
生成express應用
// --view=pug 代表所使用的模板引擎為pug // 模板引擎-使用特定格式快速渲染頁面的一種方式 // myapp表示要生成的應用的文件名稱 express --view=pug myapp
打開myapp
cd myapp
下載依賴
npm install
啟動應用
// DEBUG=myapp:* 表示開啟bug檢測模式 // npm start 表示啟動項目 // Linux或mac下 DEBUG=myapp:* npm start // windows下 set DEBUG=myapp:* & npm start
默認端口為3000鞭盟,瀏覽器輸入localhost:3000,看到Welcome to Express 表示成功生成應用并啟動
-
Koa
基于NodeJs的web應用框架瑰剃,由Express的原班人馬打造齿诉,致力于提供一個輕量級的架子,幾乎所有功能都需要第三方的中間件來輔助完成晌姚,使用了node的新特性粤剧,比express更簡潔,更輕量
-
express與koa對比
koa相對于express更加年輕挥唠,意味著express生態(tài)更加成熟抵恋,koa比express更加輕量,本身只提供一個架子宝磨,幾乎所有功能都需要依賴于第三方插件弧关,而express自身就集成了許多功能,這也意味著express更加笨重唤锉,會產生冗余的功能世囊,express對于初學者更加友好,自身的功能足夠使用窿祥,而koa則學習成本更高株憾,畢竟連核心的路由也去掉了,都需要通過學習第三方中間件來實現(xiàn)晒衩,而很多中間件的功能一樣号胚,api卻不同,koa使用了很多node的新特性及es6的新特性浸遗,而express則語法上比較陳舊一點猫胁,但是兼容性更好
koa起步
生成項目文件并初始化包管理文件package.json
mkdir myapp && cd myapp && npm init -y
下載koa模塊
npm install koa -S
創(chuàng)建app.js
touch app.js
編輯app.js
// 引入koa模塊 const Koa = require('koa'); // 實例化koa const app = new Koa(); // 創(chuàng)建接受Context對象的函數(shù),Context由koa提供跛锌,表示一次對話的上下文 const main = ctx => { // ctx包含請求及響應對象弃秆,通過響應對象的body設置返回的內容 ctx.response.body = 'Hello World'; } // 使用加載main函數(shù),注冊到koa app.use(main); // 監(jiān)聽并啟動服務 app.listen(3000);
銜接上文對象髓帽,ctx.response.type設置返回數(shù)據(jù)類型
const Koa = require('koa'); const app = new Koa(); const main = ctx => { // text或text/plain純文本 // html或text/html解析為html // json ctx.response.type = 'html'; ctx.response.body = 'Hello World'; } app.use(main); app.listen(3000);
-
路由
簡單來說路由間url到函數(shù)的映射菠赚,一個url指向一個地址,由此執(zhí)行一個對應的規(guī)則郑藏,通常在web中理解為一個函數(shù)衡查,而url到這個函數(shù)的過程稱之為路由
-
原生路由
網(wǎng)站一般都是由多個頁面組成的,不同的url指向不同的頁面必盖,在koa中可以通過ctx.request.path獲取用戶請求的路徑
我們可以將我們的body指向一個網(wǎng)頁模板拌牲,通過fs.createReadStream()獲取文件流
const Koa = require('koa'); const fs = require('fs'); const app = new Koa(); const main = ctx => { ctx.response.type = 'html'; if(ctx.request.path === '/') { ctx.response.body = fs.createReadStream('./index.html'); } else { ctx.response.body = '頁面未找到'; } } app.use(main); app.listen(3000);
-
中間件
- 簡單來說就是處于操作系統(tǒng)和應用軟件之間的一個類或者說插件俱饿,具有承上啟下的作用,用于連接兩個模塊塌忽,可重用與業(yè)務邏輯無關的各種組件
-
koa-route模塊
koa-route是koa的一個第三方中間件
const Koa = require('koa'); const app = new Koa(); const fs = require('fs'); const route = require('koa-route'); const about = require('./about.js'); const home = require('./home.js'); app.use(route.get('/home', home)); app.use(route.get('/about', about)); app.listen(3000);
home.js
const home = cxt => { console.log(cxt) cxt.response.body = '首頁'; } module.exports = home;
about.js
const about = cxt => { cxt.response.body = '關于我們'; } module.exports = about;
-
靜態(tài)資源
網(wǎng)站的靜態(tài)資源(腳本拍埠、圖片、字體土居、樣式表)枣购,假如為他們都寫一個路由將會很麻煩,比如用戶需要單獨訪問該服務地址下的一張圖片
這里用到了koa-static
const Koa = require('koa'); const app = new Koa(); const path = require('path'); const static = require('koa-static'); const main = static(path.join(__dirname, 'static')); app.use(main); app.listen(3000);
-
重定向
重新指定方向(路由),有時候當用戶訪問一個頁面擦耀,當用戶權限不夠或者其他問題的時候棉圈,我們需要給用戶一個響應,則需要重新為用戶指定頁面
const Koa = require('koa'); const app = new Koa(); const route = require('koa-route'); const redirect = ctx => { ctx.response.redirect('/'); }; const main = ctx => { ctx.response.body = '首頁'; }; app.use(route.get('/redirect', redirect)); app.use(route.get('/', main)); app.listen(3000);
-
異步中間件
當出現(xiàn)異步操作時眷蜓,比如異步讀取文件迄损,查詢數(shù)據(jù)庫等,我們就必須把我們的中間件設置為異步
const Koa = require('koa'); const app = new Koa(); const route = require('koa-route'); const fs = require('fs'); function readFile() { return new Promise((resolve, reject) => { fs.readFile('./index.html', (err, data) => { resolve(data); }) }) } const main = async function (ctx, next) { ctx.response.type = 'html'; ctx.response.body = await readFile(); }; app.use(main); app.listen(2000);
-
中間件的合成
koa-compose模塊可以將多個中間件合成為一個
const compose = require('koa-compose'); const logger = (ctx, next) => { console.log(`${Date.now()} ${ctx.request.method} ${ctx.request.url}`); next(); } const main = ctx => { ctx.response.body = 'Hello World'; }; const middlewares = compose([logger, main]); app.use(middlewares);
-
錯誤處理
如果代碼運行過程中發(fā)生錯誤账磺,我們需要把錯誤信息返回給用戶。HTTP 協(xié)定約定這時要返回500狀態(tài)碼痊远。
ctx.throw()
const Koa = require('koa'); const app = new Koa(); const main = async function (ctx, next) { ctx.throw(500) }; app.use(main); app.listen(2000);
-
404錯誤
const main = ctx => { ctx.response.status = 404;// 等同于ctx.throw(404) ctx.response.body = 'Page Not Found'; };
-
錯誤處理中間件
const handler = async (ctx, next) => { try { await next(); } catch (err) { ctx.response.status = err.statusCode || err.status || 500; ctx.response.body = { message: err.message }; } }; const main = ctx => { ctx.throw(500); }; app.use(handler); app.use(main);
node js(框架)
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
- 文/潘曉璐 我一進店門续室,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人谒养,你說我怎么就攤上這事挺狰。” “怎么了买窟?”我有些...
- 正文 為了忘掉前任亏推,我火速辦了婚禮学赛,結果婚禮上年堆,老公的妹妹穿的比我還像新娘。我一直安慰自己罢屈,他們只是感情好嘀韧,可當我...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著缠捌,像睡著了一般锄贷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上曼月,一...
- 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼末购!你這毒婦竟也來了破喻?” 一聲冷哼從身側響起,我...
- 正文 年R本政府宣布匀伏,位于F島的核電站,受9級特大地震影響蝴韭,放射性物質發(fā)生泄漏够颠。R本人自食惡果不足惜,卻給世界環(huán)境...
- 文/蒙蒙 一榄鉴、第九天 我趴在偏房一處隱蔽的房頂上張望履磨。 院中可真熱鬧蛉抓,春花似錦、人聲如沸剃诅。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽矛辕。三九已至笑跛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間聊品,已是汗流浹背飞蹂。 一陣腳步聲響...