<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ## 介紹 提到 Node.js 開發,不得不提目前炙手可熱的兩大框架 Express 和 Koa。 Express 誕生已有時日, 是一個基于 Node.js 平臺的極簡、靈活的 web 應用開發框架,主要基于 Connect 中間件,并且自身封裝了路由、視圖處理等功能,使用人數眾多。 Koa 相對更為年輕, 是 Express 原班人馬基于 ES7 新特性重新開發的框架,框架自身不包含任何中間件,很多功能需要借助第三方中間件解決,但是由于其基于 ES7 async 特性的異步流程控制,解決了 "callback hell" 和麻煩的錯誤處理問題,大受開發者歡迎。Koa 目前已經升級到了 2.x,以下代碼示例都會使用 Koa 2.x。 ## 示例 ### Hello World 兩者創建一個基礎的 Web 服務都非常簡單,寫法也基本相同,最大的區別是路由處理 Express 是自身集成的,而 Koa 需要引入中間件。 ~~~ // Express const express = require('express') const app = express() app.get('/', function (req, res) { res.send('Hello Express') }) app.listen(3000) ~~~ ~~~ // Koa const Koa = require('koa') const route = require('koa-route') const app = new Koa() app.use(route.get('/', async (ctx) => { ctx.body = 'Hello Koa' })) app.listen(3000) ~~~ ### Views Express 自身集成了視圖功能,提供了 consolidate.js 功能,支持幾乎所有 JavaScript 模板引擎,并提供了視圖設置的便利方法。 Koa 需要引入 koa-views 中間件。 ~~~ // Express const express = require('express') const app = express() app.set('views', __dirname + '/views') app.set('view engine', 'pug') app.get('/', function (req, res) { res.render('index', { title: 'Express' }) }) ~~~ ~~~ // Koa const Koa = require('koa') const route = require('koa-route') const views = require('koa-views') const app = new Koa() app.use(views(path.join(__dirname, './views'), { extension: 'pug' })) app.use(route.get('/', async (ctx) => { await ctx.render('index', { title: 'Koa' }) })) ~~~ ## 區別 ### 中間件模型 Koa 的中間件采用了洋蔥圈模型,所有的請求在經過中間件的時候都會執行兩次,能夠非常方便的執行一些后置處理邏輯。 例如,我們經常需要計算一個請求的響應時間,在 Koa 中, 我們可以在中間件的開始記錄初始時間,當響應返回時,代碼執行又回到了原來的中間件,此時根據當前時間和初始時間的時間差便得到了響應時間。 ~~~ function responseTime() { return async function responseTime(ctx, next) { const start = Date.now() await next() // wait for other middleware to run const delta = Math.ceil(Date.now() - start) ctx.set('X-Response-Time', delta + 'ms') }) }} ~~~ 而在 Express 中,響應返回時代碼執行并不會回到原來的中間件,此時我們需要通過監聽`response.writeHead`獲得響應返回的時機: ~~~ const onHeaders = require('on-headers') function responseTime () { return function responseTime (req, res, next) { const startAt = process.hrtime() onHeaders(res, function onHeaders () { const diff = process.hrtime(startAt) const time = diff[0] * 1e3 + diff[1] * 1e-6 res.setHeader('X-Response-Time', time + 'ms') }) next() } } ~~~ ### 異常處理 Express 使用 Node 約定的 "error-first 回調" 處理異常,并通過中間件傳播。 Koa 通過同步方式編寫異步代碼,可以通過`try catch`處理異常,非常自然。 ~~~ // Express app.use(function (err, req, res, next) { res.status(err.status || 500).send('error') }) ~~~ ~~~ // Koa app.use(async (ctx, next) => { try { await next() } catch (err) { ctx.app.emit('error', err) ctx.status = err.status || 500 ctx.body = { message: err.message } } }) ~~~ ### Context Koa 新增了一個 Context 對象,用來代替 Express 中的 Request 和 Response,作為請求的上下文對象。 Context 上除了 Request 和 Response 兩個對象之外,還有 Node.js 原生提供的 req 、res、socket 等對象。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看