nodejs框架koa常用配置

nodejs框架koa常用配置

文章目錄

  1. nodejs基礎
  2. express
  3. koa
    1. hello world
    2. koa路由
    3. nodemon 監(jiān)控文件修改
    4. koa中間件
    5. 設置靜態(tài)目錄
    6. 獲取請求參數(shù)
    7. 使用模板
    8. 跨域配置
    9. 使用vscode調(diào)試接口(下班回家了,明天再寫)

nodejs基礎(參考菜鳥教程的nodejs教程 )

  1. JavaScript語法
  2. 創(chuàng)建服務器模塊http
  3. 文件讀取模塊fs
  4. 路徑path
  5. 模塊系統(tǒng) require寡润、module.exports
  6. es6語法(新版本的nodejs除了模塊外全部支持

nodejs框架-express

文檔地址:http://www.expressjs.com.cn/

nodejs框架-koa

中文文檔地址:https://koa.bootcss.com/
node模塊倉庫地址:https://www.npmjs.com/

koa之hello world

  1. 初始化package.json

    新建目錄koademo,執(zhí)行 npm init瓷式,一路回車

  2. 創(chuàng)建一個簡單的koa應用(hello world)

    安裝koa模塊 npm install koa --save
    在項目根目錄新建app.js殖妇,app.js代碼如下:

const Koa = require('koa');
const app = new Koa();

app.use(async ctx => {
  ctx.body = 'Hello World';
});

app.listen(3000);
3. 執(zhí)行node app.js
4. 用瀏覽器訪問 http://localhost:3000

koa路由(一) koa-simple-router

https://www.npmjs.com/package/koa-simple-router
安裝 koa-simple-router模塊点骑,然后修改上面的app.js代碼刨肃,變成下面這個樣子

const Koa = require('koa')
const router = require('koa-simple-router')
const app = new Koa()
 
app.use(router(_ => {
  _.get('/', (ctx, next) => {
    ctx.body = 'hello world';
  })
  _.post('/path', (ctx, next) => {
 
  })
  // 同時支持get和post請求
  _.all('/login', (ctx, next) => {
    ctx.body = {
        code: 666,
        msg: '登錄成功'
    }
  })
  _.all('/regester', (ctx, next) => {
    ctx.body = {
        code: 666,
        msg: '注冊成功'
    }
  })
}))

app.listen(3000,()=>{
    console.log('服務已啟動圃阳,在 http://localhost:3000/');
});

啟動服務孽文,用瀏覽器訪問
http://localhost:3000/login
http://localhost:3000/register

為了讓代碼結構性更好,我們可以把路由這部分單獨放在一個文件里

kao路由(二) koa-router(我目前用這個)

  1. 創(chuàng)建新文件夾koa-app作為項目的跟目錄

  2. 使用終端(命令提示符或者powershell)進入根目錄,初始化package.json

    npm init -y
    
  3. 安裝koa和koa-router

    npm i koa koa-router --save-dev
    
  4. 新建app.js,代碼如下

    const Koa = require('koa')
    const Router = require('koa-router')
    const app = new Koa()
    const router = new Router();
    
    router.get('/', ctx => {
      ctx.body = 'hello world'
    })
    router.get('/demo1', ctx => {
      ctx.body = 'demo1'
    })
    router.post('/demo1', ctx => {
      ctx.body = 'demo1'
    })
    router.all('/demo2', ctx => {
      ctx.body = 'demo2'
    })
    
    app.use(router.routes());
    
    app.listen(3000, () => {
      console.log('服務已啟動夺艰,在 http://localhost:3000/');
    });
    
  5. 啟動服務芋哭,用瀏覽器訪接口即可

  6. 封裝router,我們一般會把router單獨放到一個文件,然后倒入到app.js使用

    const Router = require('koa-router')
    const router = new Router();
    
    router.all('/', ctx => {
      ctx.body = 'hello world'
    })
    router.all('/add', ctx => {
      ctx.body = 'add'
    })
    router.all('/getList', ctx => {
      ctx.body = 'demo1'
    })
    router.all('/del', ctx => {
      ctx.body = 'del'
    })
    router.all('/edit', ctx => {
      ctx.body = 'edit'
    })
    
    module.exports = router;
    

    app.js里的代碼變成這樣

    const Koa = require('koa')
    const app = new Koa()
    const router = require('./router');
    
    app.use(router.routes());
    
    app.listen(3000, () => {
      console.log('服務已啟動,在 http://localhost:3000/');
    });
    

服務器自動重新部署

我們發(fā)現(xiàn)沒修改一次代碼郁副,都必須重啟才能生效减牺,這顯然不方便,我們希望修改了文件服務能自動重啟.能實現(xiàn)這樣功能的node模塊有下面兩個.

  1. nodemon和supervisor
    1. 全局安裝npm i nodemon -g 或 npm i supervisor -g
    2. 啟動服務的時候用nodemon app.js 或 supervisor app.js代替node app.js

koa中間件

一個請求從發(fā)出到返回數(shù)據(jù),如果我們想在這個過程里做一些統(tǒng)一的操作,可以使用中間件來完成.

  1. 中間件是個函數(shù)

  2. 使用中間件的方式, app.use(中間件)

    app.use((ctx, next) => {
     // 在ctx上放入username,后面的所有請求的ctx里都會有username這個變量
      ctx.username = '我是老胡';
      // 處理完之后放行,不使用next()的話,程序會被掛起來不動了
      next();  // 在vue路由守衛(wèi)里曾使用過next
    })
    
  3. 中間件有順序

設置靜態(tài)目錄

  1. 在目錄中創(chuàng)建目錄static霞势,在public下創(chuàng)建文件demo.html烹植,訪問http://localhost:3000/public/demo.html是無法訪問得到,因為我們還沒有設置靜態(tài)資源目錄,設置靜態(tài)資源目錄要用到koa-static模塊

  2. 安裝koa-static

    npm i koa-static --save-dev
    
  3. 在app.j是里加入如下代碼

const serv = require('koa-static');
app.use(serv(__dirname + '/static'));

再來訪問 http://localhost:3000/demo.html 就可以訪問了,ps: 路徑不用加public

獲取請求參數(shù)

給剛才的demo.html添加axios用來發(fā)送請求愕贡,代碼如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <script src="https://cdn.bootcss.com/axios/0.19.0-beta.1/axios.js"></script>
</head>
<body>
  <h3>
    測試koa靜態(tài)資源目錄
  </h3>

  <script>
    let url = 'http://localhost:3000/add';
    let data = {
      params: {
        username: 'laohu',
        phone: 13800000000
      }
    }
    axios.get(url, data).then(res => {
      console.log(res);
    })

  </script>
</body>
</html>

  1. 獲取get請求參數(shù)
    在router.js的add接口里加入如下代碼
router.all('/add', ctx => {
  // 獲取get請求參數(shù)
  const username = ctx.query.username;
  const phone = ctx.query.phone;
  // 把拿到的數(shù)據(jù)放入ctx.body
  ctx.body = {
    module: 'add',
    username,
    phone
  }
})
  1. 獲取post請求
    獲取post請求需要使用koa-body模塊
    安裝koa-body npm i koa-body --save

    npm i koa-body --save
    

    在app.js里加入如下代碼:

const koaBody = require('koa-body');
app.use(koaBody());

獲取post請求參數(shù)的代碼如下

ctx.request.body.xxx
使用模板

一般請求一個接口返回的是一坨數(shù)據(jù),然而有時候我們希望返回的是一個html網(wǎng)頁或者一段html代碼(上周分享的服務器渲染)
我們試用koa-swig模塊來向前端返回一個html

  1. 安裝koa-swig
npm i koa-swig --save-dev

在根目錄創(chuàng)建views目錄巷屿,在views目錄下創(chuàng)建tpl.html,代碼如下

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>

<body>
  <h3><%=title %></h3>
  <ul>
    <%
      list.forEach(item=>{
    %>
    <li><%=item.username %> => <%=item.age %></li>
    <%
    })
    %>
  </ul>
</body>

</html>
  1. 在app.js添加如下代碼:
const views = require("koa-views");
app.use(views(path.join(__dirname, "views"), {
  map: {
    html: 'underscore'
  }
}));
   
// 在路由中使用   
router.all('/', async ctx => {
  const list = [{
      username: '約書亞',
      age: 22
    },
    {
      username: '亞伯拉罕',
      age: 100
    },
    {
      username: '挪亞',
      age: 500
    }
  ]

  await ctx.render('tpl', {
    title: 'kao-框架實戰(zhàn)',
    list
  });
})
  1. 訪問 http://localhost:3000固以,就可以看到一個html頁面

ps: 要訪問一個接口,吐出一個頁面你還可以直接在js里使用反引號``拼接模板,當然也可以使用vue來渲染

跨域配置

自己編寫一個中間件即可,代碼如下

// 跨域設置
app.use(async (ctx, next) => {
  ctx.set("Access-Control-Allow-Origin", "*");
  await next();
})

訪問剛才的demo.html文件, http://localhost:3000/demo.html,你會發(fā)現(xiàn)你的請求的響應頭上添加了Access-Control-Allow-Origin: *,說明服務器跨域設置已經(jīng)成功了.

demo地址
(未完待續(xù))
相關文章:
mongoose常用操作

egg+mongodb 配置
koa+mogodb創(chuàng)建簡單的增刪改查項目(待更新)

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市嘱巾,隨后出現(xiàn)的幾起案子憨琳,更是在濱河造成了極大的恐慌,老刑警劉巖旬昭,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件篙螟,死亡現(xiàn)場離奇詭異,居然都是意外死亡问拘,警方通過查閱死者的電腦和手機遍略,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事匀钧±酰” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵荞估,是天一觀的道長。 經(jīng)常有香客問我,道長僧著,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任障簿,我火速辦了婚禮盹愚,結果婚禮上,老公的妹妹穿的比我還像新娘卷谈。我一直安慰自己杯拐,他們只是感情好,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著端逼,像睡著了一般朗兵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上顶滩,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天余掖,我揣著相機與錄音,去河邊找鬼礁鲁。 笑死盐欺,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的仅醇。 我是一名探鬼主播冗美,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼析二!你這毒婦竟也來了粉洼?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤叶摄,失蹤者是張志新(化名)和其女友劉穎属韧,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛤吓,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡宵喂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了会傲。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锅棕。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖唆铐,靈堂內(nèi)的尸體忽然破棺而出哲戚,到底是詐尸還是另有隱情,我是刑警寧澤艾岂,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布顺少,位于F島的核電站,受9級特大地震影響王浴,放射性物質發(fā)生泄漏脆炎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一氓辣、第九天 我趴在偏房一處隱蔽的房頂上張望秒裕。 院中可真熱鬧,春花似錦钞啸、人聲如沸几蜻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽梭稚。三九已至颖低,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間弧烤,已是汗流浹背忱屑。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留暇昂,地道東北人莺戒。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像急波,于是被迫代替她去往敵國和親从铲。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 框架提出的背景 ES6/7帶來的變革 自ES6確定和ES7中async/await開始普及澄暮,Node的發(fā)展變得更加...
    宮若石閱讀 8,513評論 1 14
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,262評論 25 707
  • 廣州今天真的太濕冷了食店,適合在室內(nèi)碼字。 抗老意識絕對是先于抗老產(chǎn)品和動作的赏寇,只有當你意識到抗老是一項長期和全面工作...
    一只湯圓在南方閱讀 205評論 0 0
  • 對星星的諾言 星星睜著眼睛, 掛在黑絲絨上亮晶晶价认。 你們從上往下望嗅定, 看我可純真? 星星睜著眼睛用踩, 嵌在寧謐的天空...
    葛麗娜閱讀 1,192評論 0 0