node js(框架)

  • 框架

    • 是一種概念征讲,是對常見功能的封裝扇苞,是整個或部分系統(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);
            
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末垮抗,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子碧聪,更是在濱河造成了極大的恐慌冒版,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逞姿,死亡現(xiàn)場離奇詭異辞嗡,居然都是意外死亡,警方通過查閱死者的電腦和手機滞造,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門续室,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人谒养,你說我怎么就攤上這事挺狰。” “怎么了买窟?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵丰泊,是天一觀的道長。 經常有香客問我始绍,道長瞳购,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任亏推,我火速辦了婚禮学赛,結果婚禮上年堆,老公的妹妹穿的比我還像新娘。我一直安慰自己罢屈,他們只是感情好嘀韧,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著缠捌,像睡著了一般锄贷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上曼月,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天谊却,我揣著相機與錄音,去河邊找鬼哑芹。 笑死炎辨,一個胖子當著我的面吹牛,可吹牛的內容都是我干的聪姿。 我是一名探鬼主播碴萧,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼末购!你這毒婦竟也來了破喻?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤盟榴,失蹤者是張志新(化名)和其女友劉穎曹质,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體擎场,經...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡羽德,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了迅办。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宅静。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡坛缕,死狀恐怖瞒滴,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情爷怀,我是刑警寧澤镊绪,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布匀伏,位于F島的核電站,受9級特大地震影響蝴韭,放射性物質發(fā)生泄漏够颠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一榄鉴、第九天 我趴在偏房一處隱蔽的房頂上張望履磨。 院中可真熱鬧蛉抓,春花似錦、人聲如沸剃诅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽矛辕。三九已至笑跛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間聊品,已是汗流浹背飞蹂。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留翻屈,地道東北人陈哑。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像伸眶,于是被迫代替她去往敵國和親惊窖。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345