nodejs koa框架使用

1: KOA 是express 打造的下一代web 開發框架提供更小更強的的核心功能,通過Promise 、async/await 進行異步編程,koa 可以不使用回調,解決了回調地獄的問題
blueBird 是nodejs 最出名的Primise 實現,除了實現標準的promise 之外,還提供了包裝方法,可以快速得獎回調包裝微Promise

2:bluebird 的使用
npm install bluebird -save
方法簽名: bluebird.promisifyAll(target,options);

target 表示需要包裝的對象,如果target是普通對象,包裝后api 只會被當前對象持有,如果是原型對象,則會被所有的實例持有
options:
suffix :后綴,默認是Async
mutiArgs : 是否允許多個回調參數,默認是false,為true時,bluebird 將所有參數傳入一個數組,promise.then() 接受該數組,從而可以得到多個參數
編程案例:

const bluebird = require('bluebird');
const fs = require('fs');bluebird.promisifyAll(fs);//回調
fs.readFile('文件路徑',{encoding:'utf8'},(err,data)=>{if(err){console.error(err);return;}console.log(data);
});//Promise
fs.readFileAsync('文件路徑',{encoding:'utf8'},(err,data)=>{console.log(data);
}).catch((err)=>{console.error(err);
});

編寫第一個koa 程序:

//導入koa 模塊
const Koa = require('koa');
//實例化應用
const app = new Koa();//中間件
app.use(async (ctx)=>{ctx.body = 'hello world';
});app.listen(8080,()=>{console.log('start up 8080');
})

//Context 成為koa 的文件上下文,包含了對象的請求、響應、context 可以理解為一個容器
//常用的屬性和方法
//ctx.request koa的請求對象一般不直接使用,通過別名來訪問
//ctx.response koa的響應對象一般不直接使用,通過別名來訪問
//ctx.state 自定義數據存儲,比如中間件需要往請種種掛在變量,就可以存放在
//state 后續中間件可以讀取
//ctx.throw() 拋出http 異常
//ctx.headers 請求報頭,ctx.request.headers 的別名
//ctx.method 請求方法,ctx.request.method 的別名
//ctx.url 請求連接,ctx.request.url 的別名
//ctx.path 請求路徑,ctx.request.path 的別名
//ctx.query 請求參數,ctx.request.query 的別名,解析后的get請求參數對象
//ctx.host 請求域名地址,ctx.request.host 的別名
//ctx.ip 請求客戶端ip,ctx.request.ip 的別名
//ctx.ips 請求ip列表,ctx.request.ips 的別名 ,反向代理環境下IP列表
//ctx.get() 讀取請求報頭,ctx.request.get 的別名
//ctx.body 響應內容,支持字符串,數組,對象,buffer 等,,ctx.response.get 的別名
//ctx.type 響應體類型,ctx.response.type 的別名
//ctx.redirect()重定向 ctx.response.redirect 的別名
//ctx.set() 設置相應報頭 ,ctx.response.set 的別名

代碼驗證:

//導入koa 模塊
const { method } = require('bluebird');
const Koa = require('koa');
//實例化應用
const app = new Koa();app.proxy = true;app.use(async (ctx)=>{ctx.set('x-version','1.0');ctx.body = {method: ctx.method,ip: ctx.ip,path: ctx.path,url: ctx.url,query: ctx.query,headers: ctx.headers} 
});app.listen(8080,()=>{console.log('start up 8080');
})

執行結果:
http://localhost:8080/?name=%E5%88%98%E4%BA%A6%E8%8F%B2

{"method":"GET","ip":"::ffff:127.0.0.1","path":"/","url":"/?name=%E5%88%98%E4%BA%A6%E8%8F%B2","query":{"name":"劉亦菲"},"headers":{"host":"localhost:8080","connection":"keep-alive","sec-ch-ua":"\"Not;A=Brand\";v=\"99\", \"Google Chrome\";v=\"139\", \"Chromium\";v=\"139\"","sec-ch-ua-mobile":"?0","sec-ch-ua-platform":"\"Windows\"","upgrade-insecure-requests":"1","user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36","accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7","sec-fetch-site":"none","sec-fetch-mode":"navigate","sec-fetch-user":"?1","sec-fetch-dest":"document","accept-encoding":"gzip, deflate, br, zstd","accept-language":"zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7"}}

Cookie 的設置和讀取

//導入koa 模塊
const { method } = require('bluebird');
const Koa = require('koa');
//實例化應用
const app = new Koa();app.keys = ['13wweeiioo'];
//cookie 設置和讀取
app.use(async (ctx)=>{ctx.cookies.set('logined',1,{signed: true,httpOnly: true,maxAge: 3600 * 24 * 1000 //有效期一天});ctx.body = "ok la";
});app.listen(8080,()=>{console.log('start up 8080');
})

中間件
與expres 的中間件類似,Koa 的中間建也你能訪問請求對象響應對象和next 函數通常用來執行以下任務:
執行邏輯
更改請求和響應
結束請求-相應周期
調用下一個中間建
錯誤處理

koa 使用async /await 來進行異步編程,不需要執行回調函數,直接對ctx.body 賦值就行
Koa 的中間件是一個表中的異步函數,簽名如下:
async function middleware(ctx,next);
ctx 是上下文
next 下一個中間件
運行完代碼邏輯,將需要傳遞的數據掛在到ctx.state ,并且調用 await.next() 才能將請求轉發給下一個中間件
(洋蔥卷模型)
代碼案例:

const Koa = require('koa');
//實例化應用
const app = new Koa();async function mid1(ctx,next){console.log('mid1 begin');await next();console.log('mid1 end');
}async function mid2(ctx,next){console.log('mid2 begin');await next();console.log('mid2 end');
}app.use(mid1);
app.use(mid2);app.use(async (ctx)=>{console.log('request route!');ctx.body = 'Hello world';
});app.listen(8080,()=>{console.log('start up 8080');
})

執行結果:
mid1 begin
mid2 begin
request route!
mid2 end
mid1 end

日志中間件

const Koa = require('koa');
//實例化應用
const app = new Koa();async function logger(ctx,next) {const start = Date.now();await next();console.log(`${ctx.method} ${ctx.path} costTime:${Date.now() - start}ms`); 
}app.use(logger); //注冊日志中間件
app.use(async (ctx)=> {ctx.body = 'Hello World';
});app.listen(8080,()=>{console.log('start up 8080');
})

cookie 解析中間件:

const Koa = require('koa');
//實例化應用
const app = new Koa();//定義cookie中間件
async function cookieParser(ctx,next) {const headerCookie = ctx.headers.cookie;ctx.state.cookies = {};if(headerCookie){const cookies = headerCookie.split(";");cookies.forEach(cookie => {const parts = cookie.split('=');ctx.state.cookies[parts[0] = parts[1]];//掛在 ctx.state.cookies});await next();}
}//注冊中間件
app.use(cookieParser);//使用中間建
app.use(async (ctx)=>{ctx.body = ctx.state.cookies;
});//監聽服務啟動
app.listen(8000,()=>{console.log('start up 8000');
})

KOA 路由:
安裝路由模塊:
npm install koa-router -save
C:\Users\Lei.Wang170\Desktop\koa-01>npm install koa-router -save 這種寫法已經不適用了
npm warn deprecated koa-router@14.0.0: Please use @koa/router instead, starting from v9!

使用新的安裝命令:
C:\Users\Lei.Wang170\Desktop\koa-01>npm install @koa/router -save
added 1 package in 922ms
1 package is looking for funding
run npm fund for details
路由案例:

const Koa = require('koa');
const Router = require('koa-router');
//實例化應用
const app = new Koa();const router = new Router();//路由定義
router.get('/',async (ctx)=>{ctx.body ='hello world';
});router.get('/user',async (ctx)=>{ctx.body ='hello user';
});//掛載路由
app.use(router.routes());
app.use(router.allowedMethods());app.listen(8000,()=>{console.log('start up 8000');
})

錯誤處理:

const Koa = require('koa');
//實例化應用
const app = new Koa();//自定義中間件
async function errorHandler(ctx,next) {try {await next();} catch (error) {ctx.status = error.status || 500;ctx.body = `System Error: ${error.message}`;}
}
app.use(errorHandler);  //掛在中間件不需要括號,掛在路由需要括號()//拋出異常
app.use((ctx)=>{ctx.throw(403,'Forbidden');
});app.listen(8000,()=>{console.log('start up 8000');
})

注意錯誤處理器一定在在使用之前被掛載上,否則不成功

多個錯誤處理器的場景:
同時需要響應錯誤給調用端,并且要記錄日志

const Koa = require('koa');
//實例化應用
const app = new Koa();//自定義中間件
async function errorHandler(ctx,next) {try {await next();} catch (error) {ctx.status = error.status || 500;ctx.body = `System Error: ${error.message}`;}
}//錯誤日志記錄中間件
async function loggerHandler(ctx,next) {try {await next();} catch (error) {console.log(`error: ${ctx.path} ${ctx.ip}`);throw error;}
}app.use(errorHandler);  //掛在中間件不需要括號,掛在路由需要括號()
app.use(loggerHandler); 
//拋出異常
app.use((ctx)=>{ctx.throw(403,'Forbidden');
});app.listen(8010,()=>{console.log('start up 8010');
})

執行結果
在這里插入圖片描述
在這里插入圖片描述

路由級別的中間件

const Koa = require('koa');
const Router = require('koa-router');
const router = new Router();
//實例化應用
const app = new Koa();
//錯誤日志記錄中間件
async function loggerHandler(ctx,next) {console.log(`error: ${ctx.path} ${ctx.ip}`);await next();      
}router.get('/',loggerHandler,async (ctx)=>{ctx.body ='hello world';
});app.listen(8010,()=>{console.log('start up 8010');
})

模塊化路由:
student.js
const Router = require(‘koa-router’);
//定義帶有前綴的路由
const router = new Router({ prefix: ‘/student’ });
//路由定義
router.get(‘/name’, (ctx)=>{
ctx.body =‘student’;
});
module.exports = router;

teacher.js
const Router = require(‘koa-router’);
//定義帶有前綴的路由
const router = new Router({ prefix: ‘/teacher’ });
//路由定義
router.get(‘/id’, (ctx)=>{
ctx.body =‘teacher’;
});
module.exports = router;

koa.js
const Koa = require(‘koa’);
//實例化應用
const app = new Koa();

const stuRouter = require(‘./routes/student’);
const teaRouter = require(‘./routes/teacher’);

app.use(stuRouter.routes()).use(stuRouter.allowedMethods());
app.use(teaRouter.routes()).use(teaRouter.allowedMethods());

app.listen(8010,()=>{
console.log(‘start up 8010’);
})

koa-ejs 模板渲染:
npm install koa-ejs --save

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/94260.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/94260.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/94260.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2025年圖像處理與光學國際會議(ICIPO 2025)

2025年圖像處理與光學國際會議(ICIPO 2025) 2025 International Conference on Image Processing and Optics一、大會信息會議簡稱:ICIPO 2025 大會地點:中國北京 審稿通知:投稿后2-3日內通知 投稿郵箱:iac…

Kubernetes 構建高可用、高性能 Redis 集群

k8s下搭建Redis高可用1. 部署redis服務創建ConfigMap創建 Redis創建 k8s 集群外部2. 創建 Redis 集群自動創建 redis 集群手動創建 redis 集群驗證集群狀態3. 集群功能測試壓力測試故障切換測試4. 安裝管理客戶端編輯資源清單部署 RedisInsight控制臺初始化控制臺概覽實戰環境使…

文件IO的基礎操作

Java針對文件進行的操作:文件系統操作,File類(file類指定的路徑,可以是一個不存在的文件)文件內容操作 : 流對象分為兩類(1)字節流 以字節為基本的讀寫單位的 二進制文件 InputStream OutputStream(2)字符流 以字符為基本的讀寫單位的 …

【模版匹配】基于深度學習

基于深度學習的模版匹配 概述 本報告整理了2024-2025年最新的、可直接使用的模板匹配相關論文、方法和開源代碼實現。所有方法都提供了完整的代碼實現和預訓練模型,可以直接應用到實際項目中。 一、輕量級現代模板匹配框架 1.1 UMatcher - 4M參數的緊湊型模板匹…

CMake進階:Ninja環境搭建與加速項目構建

目錄 1.引入Ninja的原因 2.Ninja 環境搭建(跨平臺) 2.1.Linux系統安裝 2.2.macOS 系統 2.3.Windows 系統 2.4.源碼編譯安裝(通用方案) 3.Ninja 與構建系統配合:以 CMake 為例 4.加速構建的關鍵技巧 5.Ninja 與…

開發避坑指南(35):mybaits if標簽test條件判斷等號=解析異常解決方案

異常信息 org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.builder.BuilderException: The expression orderInfo.idList evaluated to a null value.報錯語句 <if test"orderInfo.queryFlag ! null and orderInfo.queryFlag sett…

GitCode 疑難問題診療:全面指南與解決方案

引言 在軟件開發的動態領域中&#xff0c;GitCode 作為一款強大的分布式版本控制系統&#xff0c;已然成為團隊協作與項目管理的基石。它賦予開發者高效管理代碼版本、輕松實現并行開發以及順暢協同合作的能力。然而&#xff0c;如同任何復雜的技術工具&#xff0c;在 GitCode…

使用 JS 渲染頁面并導出為PDF 常見問題與修復

本文直擊兩個最常見的導出痛點&#xff0c;并給出可直接落地的診斷 修復方案&#xff08;適用于 html2canvas jsPDF ECharts/自繪 canvas 場景&#xff09;。 問題清單 問題 A&#xff1a;導出后圖表模糊&#xff0c;線條與文字不清晰&#xff08;低分辨率&#xff09;。問題…

【Java后端】【可直接落地的 Redis 分布式鎖實現】

可直接落地的 Redis 分布式鎖實現&#xff1a;包含最小可用版、生產可用版&#xff08;帶 Lua 原子解鎖、續期“看門狗”、自旋等待、可重入&#xff09;、以及基于注解AOP 的無侵入用法&#xff0c;最后還給出 Redisson 方案對比與踩坑清單。一、設計目標與約束 獲取鎖&#x…

數據結構 -- 鏈表--雙向鏈表的特點、操作函數

雙向鏈表的操作函數DouLink.c#include "DouLink.h" #include <stdio.h> #include <stdlib.h> #include <string.h>/*** brief 創建一個空的雙向鏈表* * 動態分配雙向鏈表管理結構的內存&#xff0c;并初始化頭指針和節點計數* * return 成功返回指…

Wireshark獲取數據傳輸的碼元速率

一、Wireshark的物理層參數 Wireshark主界面可以看到數據發送時刻和長度&#xff1a; 這個時刻是Wireshark完整獲取數據包的時刻&#xff0c;實際上就是結束時刻。 需要知道的是&#xff1a; Wireshark工作在數據鏈路層及以上&#xff0c;它能解碼 以太網幀 / IP 包 / TCP…

11.1.3 完善注冊登錄,實現文件上傳和展示

1、完善注冊/登錄 1. 涉及的數據庫表單&#xff1a;user_info 2. 引用MySQL線程池&#xff0c;Redis線程池 3. 完善注冊功能 4. 完善登錄功能 2.1 涉及的數據庫表單&#xff1a;user_info 重新創建數據庫 #創建數據庫 DROP DATABASE IF EXISTS 0voice_tuchuang;CREATE D…

【Linux文件系統】目錄結構

有沒有剛進入Linux世界時&#xff0c;對著黑乎乎的終端&#xff0c;輸入一個 ls / 后&#xff0c;看著蹦出來的一堆名字 like bin, etc, usr&#xff0c;感覺一頭霧水&#xff0c;像是在看天書&#xff1f; 別擔心&#xff0c;你不是一個人。Linux的文件系統就像一個超級有條理…

螺旋槽曲面方程的數學建模與偏導數求解

螺旋槽曲面的數學描述 在鉆頭設計和機械加工領域,螺旋槽的幾何建模至關重要。螺旋槽通常由徑向截形繞軸做螺旋運動形成,其數學模型可通過參數方程和隱函數方程兩種方式描述。 設螺旋槽的徑向截形方程為: y=f(z)y = f(z)y=f(z) x=xcx = x_cx=xc? 其中 xcx_cxc? 為常數,…

線性回歸:機器學習中的基石

在機器學習的眾多算法中&#xff0c;線性回歸無疑是最基礎也是最常被提及的一種。它不僅在統計學中占有重要地位&#xff0c;而且在預測分析和數據建模中也發揮著關鍵作用。本文將深入探討線性回歸的基本概念、評估指標以及在實際問題中的應用&#xff0c;并通過一個模擬的氣象…

編程刷題-資料分發1 圖論/DFS

P2097 資料分發 1 題目描述 有一些電腦&#xff0c;一部分電腦有雙向數據線連接。 如果一個電腦得到數據&#xff0c;它可以傳送到的電腦都可以得到數據。 現在&#xff0c;你有這個數據&#xff0c;問你至少將其輸入幾臺電腦&#xff0c;才能使所有電腦得到數據。 輸入格式 第…

RabbitMQ:延時消息(死信交換機、延遲消息插件)

目錄一、死信交換機【不推薦】二、延遲消息插件【推薦】2.1 安裝插件【Linux】2.2 安裝插件【Windows】2.3 如何使用延時消息&#xff1a;生產者發送消息時指定一個時間&#xff0c;消費者不會立刻收到消息&#xff0c;而是在指定時間之后才收到消息。 延時任務&#xff1a;設置…

動學學深度學習05-深度學習計算

動學學深度學習pytorch 參考地址&#xff1a;https://zh.d2l.ai/ 文章目錄動學學深度學習pytorch1-第05章-深度學習計算1. 層&#xff08;Layer&#xff09;與塊&#xff08;Block&#xff09;1.1 什么是深度學習中的“層”&#xff1f;1.2 什么是“塊”&#xff08;Block&…

智慧工廠煙霧檢測:全場景覆蓋與精準防控

智慧工廠煙霧檢測&#xff1a;構建工業安全的智能防線&#xff08;所有圖片均為真實項目案例&#xff09;在工業4.0時代&#xff0c;智慧工廠通過物聯網、人工智能與大數據技術的深度融合&#xff0c;實現了生產流程的數字化與智能化。然而&#xff0c;工廠環境中的火災隱患始終…

@JsonIgnoreProperties注解詳解

JsonIgnoreProperties是 Jackson 庫中的一個重要注解&#xff0c;用于在 JSON 序列化&#xff08;對象轉 JSON&#xff09;和反序列化&#xff08;JSON 轉對象&#xff09;過程中??控制屬性的可見性??。它提供了更高級別的屬性忽略能力&#xff0c;特別適合處理復雜場景。一…