koa2入門學習

来源:http://www.cnblogs.com/beileixinqing/archive/2017/11/15/7838258.html
-Advertisement-
Play Games

koa模塊 koa-route 路由 route.get("路徑",路由函數) koa-static 靜態資源載入 const serve(路徑) koa-compose 中間件合成模塊 koa-body 提取表單post請求鍵值對,處理上傳文件 上下文context的response和reques ...


koa模塊

koa-route 路由 route.get("路徑",路由函數)

koa-static 靜態資源載入     const serve(路徑)

koa-compose  中間件合成模塊

koa-body   提取表單post請求鍵值對,處理上傳文件

上下文context的response和request

 

ctx.response.body   //返回的主體內容

ctx.response.redirect //重定向

ctx.response.type   //返回的MIME類型

ctx.response.path  //獲取用戶請求的路徑

ctx.response.status  //返回的狀態碼

ctx.request.accepts //請求的mime類型

ctx.request.method //請求的方法

ctx.request.url         //請求的url

ctx.request.body //請求的body

 

中間件(middleware)

Logger 列印日誌 //不需要引入任何,直接輸入console.log,在命令框就會列印出來

中間件功能可以拆分成一個獨立函數比如叫logger,參數(ctx,next) 然後app.use(logger),用來載入中間件

基本上,Koa 所有的功能都是通過中間件實現的,前面例子裡面的main也是中間件。

每個中間件預設接受兩個參數,第一個參數是 Context 對象,第二個參數是next函數。

只要調用next函數,就可以把執行權轉交給下一個中間件。

中間件棧

 

多個中間件會形成一個棧結構(middle stack),以"先進後出"(first-in-last-out)的順序執行。

  1. 最外層的中間件首先執行。
  2. 調用next函數,把執行權交給下一個中間件。
  3. ...
  4. 最內層的中間件最後執行。
  5. 執行結束後,把執行權交回上一層的中間件。
  6. ...
  7. 最外層的中間件收回執行權之後,執行next函數後面的代碼。

例如:有多個中間件,每個中間件分別寫了next()函數,則每個中間件會分別先執行next()函數之前的列印,然後再分別執行next()之後的列印,如果不寫next()函數,那麼執行權就不會傳遞下去,則只列印第一個中間件的內容。

const one = (ctx, next) => {
  console.log('>> one');
  next();
  console.log('<< one');
}

const two = (ctx, next) => {
  console.log('>> two');
  next(); 
  console.log('<< two');
}

const three = (ctx, next) => {
  console.log('>> three');
  next();
  console.log('<< three');
}

app.use(one);
app.use(two);
app.use(three);
>> one
>> two
>> three
<< three
<< two
<< one
const Koa = require('koa');
const app = new Koa();

const one = (ctx, next) => {
  console.log('>> one');
  // next();
  console.log('<< one');
}

const two = (ctx, next) => {
  console.log('>> two');
  // next();
  console.log('<< two');
}

const three = (ctx, next) => {
  console.log('>> three');
  // next();
  console.log('<< three');
}

app.use(one);
app.use(two);
app.use(three);

app.listen(3000);
>>one
<<one
const Koa = require('koa');
const app = new Koa();

const one = (ctx, next) => {
  console.log('>> one');
  next();
  console.log('<< one');
}

const two = (ctx, next) => {
  console.log('>> two');
  // next();
  console.log('<< two');
}

const three = (ctx, next) => {
  console.log('>> three');
  next();
  console.log('<< three');
}

app.use(one);
app.use(two);
app.use(three);

app.listen(3000);
>>one
>>two
<<two
<<one

非同步中間件

比如讀取資料庫等的非同步操作,使用ES8 的 async和await

中間件的合成

koa-compose模塊可以將多個中間件合成為一個

錯誤處理

ctx.throw()方法   參數為錯誤的http狀態碼

當直接用ctx.throw()拋出錯誤之後,則不能在定義返回的頁面顯示內容,所以可以先設置返回的狀態碼為相應的狀態碼,然後定義返回頁面的內容

const main = ctx => {
  ctx.response.status = 404;
  ctx.response.body = 'Page Not Found';
};

處理錯誤的中間件

使用try..catch捕獲

try{

  await next()

}catch{

  錯誤處理

}

error 事件的監聽

運行過程中一旦出錯,Koa 會觸發一個error事件。監聽這個事件,也可以處理錯誤。

釋放 error 事件

需要註意的是,如果錯誤被try...catch捕獲,就不會觸發error事件。這時,必須調用ctx.app.emit(),手動釋放error事件,才能讓監聽函數生效。

const handler = async (ctx, next) => {
  try {
    await next();
  } catch (err) {
    ctx.response.status = err.statusCode || err.status || 500;
    ctx.response.type = 'html';
    ctx.response.body = '<p>Something wrong, please contact administrator.</p>';
    ctx.app.emit('error', err, ctx);
  }
};

const main = ctx => {
  ctx.throw(500);
};

app.on('error', function(err) {
  console.log('logging error ', err.message);
  console.log(err);
});

Cookies

ctx.cookies用來讀寫 Cookie。

表單

Web 應用離不開處理表單。本質上,表單就是 POST 方法發送到伺服器的鍵值對。koa-body模塊可以用來從 POST 請求的數據體裡面提取鍵值對。

文件上傳

參考鏈接:阮一峰老師的文章

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • CSS3基礎 1 樣式表的使用 1.內聯樣式表。 隻影響單個元素,常用於標簽。 <p style="color: aqua;font-size: 20px">This is CSS.</p> 2.內部樣式表。 對本頁面元素起作用,一般寫在<head></head>中,用<style></style> ...
  • js的函數傳參的方式是按值傳遞,正常情況下,改變函數參數的值,並不會對函數外部的變數造成影響。例如: 這是因為js的函數在接收參數時,會生成一個副本變數,該副本變數等於參數的值,可以分析js這樣運行的: 但是當函數的參數傳遞的是一個對象呢? 發現函數內部居然改變了函數外部變數的值,那這又是為什麼呢? ...
  • 在網上找到一個練手項目,記錄一下自己的實現過程和遇到的問題 附上鏈接 前端練手項目-先定一個小目標,做他一個天貓官網 前端練手項目-天貓官網 先確定一下需要幾個頁面 首先要有公共頁面 其次是 步驟 1 : 首頁 步驟 2 : 分類頁 步驟 3 : 查詢結果頁 步驟 4 : 產品頁 步驟 5 : 結算 ...
  • 案例1:效果 代碼: 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns=" ...
  • 在面向對象的程式設計里,一般都提供了實現隊列(queue)和堆棧(stack)的方法,而對於JS來說,我們可以實現數組的相關操作,來實現隊列和堆棧的功能,看下麵的相關介紹. 一 看一下它們的性質,這種性質決定了它們的使用場合 隊列:是一種支持先進先出(FIFO)的集合,即先被插入的數據,先被取出! ...
  • 什麼是變數:存放物體的一個容器,以便後續利用該容器存放的物體。 變數的聲明及賦值: 聲明變數關鍵字var; 變數名的規範:變數名由英文字母、數字、下劃線、美元符號組成,但是首字母只能是英文字母、下劃線、美元符號; 聲明變數使用單一var模式(多個變數只用一個var,因為每出現一個var就需要向系統請 ...
  • 閉包是javascript中一個十分常見但又很難掌握的概念,無論是自己寫代碼還是閱讀別人的代碼都會接觸到大量閉包。之前也沒有系統學習過,最近系統地總結了一些閉包的使用方法和使用場景,這裡做個記錄,希望大家指正補充。 一、定義 《JavaScript忍者秘籍》中對於閉包的定義是這樣的: 閉包是一個函數 ...
  • CSS中關於P標簽中的樣式: 1、font-family:瀏覽器在顯示字體的時候,依次判斷是否支持當前的字體,直到最後的字體系列。 font-family:"宋體","仿宋",sans-serif; 瀏覽器若不支持宋體,則用仿宋;若不支持仿宋,則在sans-serif中找。 2、font-weigh ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...