日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Koa框架

發布時間:2024/7/5 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Koa框架 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、認識Koa

前面我們已經學習了express,另外一個非常流行的Node Web服務器框架就是Koa。

Koa官方的介紹:

  • koa:next generation web framework for node.js;
  • koa:node.js的下一代web框架;

事實上,koa是express同一個團隊開發的一個新的Web框架:

  • 目前團隊的核心開發者TJ的主要精力也在維護Koa,express已經交給團隊維護了;
  • Koa旨在為Web應用程序和API提供更小、更豐富和更強大的能力;
  • 相對于express具有更強的異步處理能力(后續我們再對比);
  • Koa的核心代碼只有1600+行,是一個更加輕量級的框架,我們可以根據需要安裝和使用中間件;

事實上學習了express之后,學習koa的過程是很簡單的;

二、Koa初體驗

我們來體驗一下koa的Web服務器
koa注冊的中間件提供了兩個參數:

  • ctx:上下文(Context)對象;
    koa并沒有像express一樣,將req和res分開,而是將它們作為ctx的屬性;
    ctx代表依次請求的上下文對象;
    ctx.request:獲取請求對象;
    ctx.response:獲取響應對象;

  • next:本質上是一個dispatch,類似于之前的next;
    后續我們學習Koa的源碼,來看一下它是一個怎么樣的函數;


  • 三、Koa中間件

    koa通過創建的app對象,注冊中間件只能通過use方法:

    • Koa并沒有提供methods的方式來注冊中間件;
    • 也沒有提供path中間件來匹配路徑;

    但是真實開發中我們如何將路徑和method分離呢?

    • 方式一:根據request自己來判斷;
    • 方式二:使用第三方路由中間件;


    四、路由的使用

    koa官方并沒有給我們提供路由的庫,我們可以選擇第三方庫:koa-router
    我們可以先封裝一個 user.router.js 的文件:

    在app中將router.routes()注冊為中間件:

    注意:allowedMethods用于判斷某一個method是否支持:

    • 如果我們請求 get,那么是正常的請求,因為我們有實現get;
    • 如果我們請求 put、delete、patch,那么就自動報錯:Method Not Allowed,狀態碼:405;
    • 如果我們請求 link、copy、lock,那么久自動報錯:Not Implemented,狀態碼:501;

    五、參數解析:params - query



    六、參數解析:json && x-www-form-urlencoded

    安裝依賴: npm install koa-bodyparser;
    使用 koa-bodyparser的中間件;


    七、參數解析:form-data



    八、Multer上傳文件




    const path = require('path') const Koa = require('koa') const bodyParser = require('koa-bodyparser') const multer = require('koa-multer') const app = new Koa() const Router = require('koa-router') const uploadRouter = new Router({prefix: '/upload'}) app.use(bodyParser()) const storage = multer.diskStorage({destination: (req, file, cb) => {cb(null, './uploads/')},filename: (req, file, cb) => {cb(null, Date.now() + path.extname(file.originalname))}, }) const upload = multer({storage }) // app.use(upload.any()) uploadRouter.post('/avatar', upload.single('avatar'), (ctx, next) => {console.log(ctx)console.log(ctx.req.file)ctx.response.body = 'upload success~' }) app.use(uploadRouter.routes()) // userRouter.post('/products', (ctx, next) => { // console.log(ctx.request.url) // console.log(ctx.request.body) // // ctx.response.body = 'hello world~' // })// app.use((ctx, next) => { // console.log(ctx.request.url) // console.log(ctx.request.query) // console.log(ctx.query) // ctx.response.body = 'hello world~' // }) // app.use(userRouter.routes()) app.listen(8000, () => {console.log('koa服務器啟動成功!') })

    九、數據的響應




    請求狀態:status

    十、靜態服務器

    koa并沒有內置部署相關的功能,所以我們需要使用第三方庫:
    npm install koa-static

    部署的過程類似于express:

    十一、錯誤處理


    十二、koa和express對比

    在學習了兩個框架之后,我們應該已經可以發現koa和express的區別:

  • 從架構設計上來說:
    • express是完整和強大的,其中幫助我們內置了非常多好用的功能;
    • koa是簡潔和自由的,它只包含最核心的功能,并不會對我們使用其他中間件進行任何的限制。甚至是在app中連最基本的get、post都沒有給我們提供;我們需要通過自己或者路由來判斷請求方式或者其他功能;
  • 因為express和koa框架他們的核心其實都是中間件:
    但是他們的中間件事實上,它們的中間件的執行機制是不同的,特別是針對某個中間件中包含異步操作時;
  • 所以,接下來,我們再來研究一下express和koa中間件的執行順序問題;

    我通過一個需求來演示所有的過程:
    假如有三個中間件會在一次請求中匹配到,并且按照順序執行;
    我希望最終實現的方案是:

  • 在middleware1中,在req.message中添加一個字符串 aaa;
  • 在middleware2中,在req.message中添加一個 字符串bbb;
  • 在middleware3中,在req.message中添加一個 字符串ccc;
  • 當所有內容添加結束后,在middleware1中,通過res返回最終的結果;
  • 實現方案:
    2. Express同步數據的實現;


  • Express異步數據的實現;
  • const express = require('express') const axios = require('axios') const app = express() const middleware1 = async (req, res, next) => {req.message = 'aaa'next()const message = await middleware3(req.message)console.log(message)res.end(message.toString()) } const middlewar2 = async (req, res, next) => {req.message += 'bbb' } const middleware3 = async (msg) => {const result = await axios.get('http://123.207.32.32:9001/lyric?id=167876')msg += result.data.lrc.lyricconsole.log(msg)return msg } app.use(middleware1, middlewar2) app.listen(8000, () =>{console.log('express服務器啟動成功') })
  • Koa同步數據的實現;

  • Koa異步數據的實現;

    注意:

  • 在koa中,next()返回的是一個promise對象,所以可以通過await next()來實現需求。

    但是在express中,next()只是一個普通的函數,所以使用await next()無效!!!

    創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的Koa框架的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。