摘要:路由封裝了和變量傳入將要處理的下一個異步函數由標記的函數稱為異步函數,在異步函數中,可以用調用另一個異步函數,這兩個關鍵字將在中引入。
koa2.x learning 路由 koa-router
const router = require("koa-router")()
ctx:封裝了request 和 response變量
next: 傳入將要處理的下一個異步函數
由async標記的函數稱為異步函數,在異步函數中,可以用await調用另一個異步函數,這兩個關鍵字將在ES7中引入。
${ctx.request.url} 輸出 請求的url 地址 ctx.url相當于ctx.request.url,ctx.type相當于ctx.response.type
處理路由器的操作分為:views、 string、 json、 處理get請求、 處理post請求
viewsrouter.get("/", async (ctx, next) => { await ctx.render("index", { title: "Hello Koa 2!" }) })string
router.get("/string",async (ctx, next) =>{ ctx.response.body = `jsonwelcome, hello
`; })
router.get("/json", async (ctx, next) => { ctx.body = { title: "koa2 json" } })處理get請求
var name = ctx.params.name;
router.get("/info/:name", async (ctx, next) => { var name = ctx.params.name; ctx.response.body = `處理post請求Hello, ${name}!
`; })
var name = ctx.request.body.name || "";
需要引入 koa-bodyparser 中間件, 創建 info.pug 用于處理表單
extends layout block content h1= title form(action="/signin" method="post") p= "用戶名:" input(type="text" name="name" value="koa") p= "密碼:" input(type="password" name="password" value="koa") p input(type="submit" value="提交")
router.get("/info", async (ctx, next) => { await ctx.render("info",{ title: "用戶信息" }); }) // 處理post請求 router.post("/signin", async (ctx,next) => { var name = ctx.request.body.name || ""; var password = ctx.request.body.password || ""; if(name === "koa" && password === "koa") { ctx.response.body = `視圖 - views層welcome, ${name}
`; }else{ ctx.response.body = `Login faild!
` } })
適用于 koa 的模板引擎選擇非常多,比如 jade、ejs、nunjucks、handlebars 、xtemplate 等。
Nunjucks是Mozilla開發的一個純JavaScript編寫的模板引擎 koa-nunjucks-2^3.0.2
https://mozilla.github.io/nun...
const koaNunjucks = require("koa-nunjucks-2") app.use(koaNunjucks({ ext: "html", path: path.join(__dirname, "views"), nunjucksConfig: { trimBlocks: true, noCache: false // 開發環境下 } }));
// 模塊 {% extends "base.html" %} {% block body %}操作cookieNo body{% endblock %} // 循環 {% for msg in data %}{{ msg }}
{% endfor %} {% if hungry %} I am hungry {% elif tired %} I am tired {% else %} I am good! {% endif %}
koa提供了從上下文直接讀取、寫入cookie的方法:
ctx.cookies.get(name, [options]) 讀取上下文請求中的cookie
ctx.cookies.set(name, value, [options]) 在上下文中寫入cookie
// 處理cookie router.get("/cookie", async (ctx,next) => { const options = { domain:"127.0.0.1", path:"/", maxAge: 10 * 60 * 1000, // cookie有效時長 expires: new Date("2019-02-02"), // cookie失效時間 httpOnly: false, // 是否只用于http請求中獲取 overwrite: false // 是否允許重寫 } ctx.cookies.set("id","test cookie",options) ctx.response.body = `操作sessioncookies, ${ctx.cookies.get("id")}
`; // 輸出cookie值 })
將session存放在MySQL數據庫中 koa-session-minimal、koa-mysql-session "koa-session-minimal":"^3.0.4","koa-mysql-session":"^0.0.2"
const session = require("koa-session-minimal") const MysqlSession = require("koa-mysql-session") // 配置存儲session let store = new MysqlSession({ user: "root", password: "", database: "test", host: "127.0.0.1", }) let cookie = { maxAge: "", // cookie有效時長 expires: "", // cookie失效時間 path: "", // 寫cookie所在的路徑 domain: "", // 寫cookie所在的域名 httpOnly: "", // 是否只用于http請求中獲取 overwrite: "", // 是否允許重寫 secure: "", sameSite: "", signed: "", } app.use(session({ key: "SESSION_ID", store: store, cookie: cookie }))
// 處理session router.get("/session", async (ctx,next) => { ctx.session = { user_id: Math.random().toString(36).substr(2), count: 0 } ctx.response.body = `操作mysqlsession, ${ctx.session.user_id}, ${ctx.session.count}
`; // 輸出cookie值 })
安裝 mysql "mysql":"^2.15.0"
用戶增、刪、改、查
// 查詢 async function queryAll(){ let sql = usersMapping.queryAll; let UsersList = await dbUtils(sql); return UsersList; } // 新增 async function insertUser(username,password,realname){ let sql = usersMapping.insertUser; var values = [username,password,realname]; // 數組 let result = await dbUtils(sql,values); if ( Array.isArray(result) && result.length > 0 ) { result = result[0] } else { result = null } return result } // 修改 async function queryById(id){ let sql = usersMapping.queryById; let result = await dbUtils(sql,id); if ( Array.isArray(result) && result.length > 0 ) { result = result[0] } else { result = null } return result } async function updateUser(id,username,password,realname){ // 從session中取 id let sql = usersMapping.updateUser; var values = [username,password,realname,id]; // 數組 let result = await dbUtils(sql,values); if ( Array.isArray(result) && result.length > 0 ) { result = result[0] } else { result = null } return result } // 刪除 async function deleteById(id){ let sql = usersMapping.deleteById; let flag = await dbUtils(sql,id); return flag; }
github:
https://github.com/lichuang44...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/93104.html
摘要:用搭建前端項目用搭建后臺,給前端提供數據訪問接口項目結構用搭建的項目,紅色框中是新建的文件夾用于存放剩下的文件在寫項目中慢慢增加,最初就是這樣的之后將項目跑起來,看一下有沒有問題這里就當作沒有問題前端這里選用和搭配這里采用的是的完整 koa2+vue 用vue-cli搭建前端項目 用koa2搭建后臺,給前端提供數據訪問接口 項目結構 showImg(https://segmentf...
摘要:接上次挖的坑,對相關的源碼進行分析第一篇。和同為一批人進行開發,與相比,顯得非常的迷你。在接收到一個請求后,會拿之前提到的與來創建本次請求所使用的上下文。以及如果沒有手動指定,會默認指定為。 接上次挖的坑,對koa2.x相關的源碼進行分析 第一篇。 不得不說,koa是一個很輕量、很優雅的http框架,尤其是在2.x以后移除了co的引入,使其代碼變得更為清晰。 express和ko...
摘要:返回的結果是一個對象,類似于表示本次后面執行之后返回的結果。對象用于一個異步操作的最終完成或失敗及其結果值的表示簡單點說就是處理異步請求。源碼分析主要脈絡函數調用后,返回一個實例。參考鏈接解釋對象的用法的源碼及其用法 本文始發于我的個人博客,如需轉載請注明出處。為了更好的閱讀體驗,可以直接進去我的個人博客看。 前言 知識儲備 閱讀本文需要對Generator和Promise有一個基本的...
摘要:目前這個爬蟲還是比較簡單的類型的,直接抓取頁面,然后在頁面中提取數據,保存數據到數據庫。總結寫這個項目其實主要的難點在于程序穩定性的控制,容錯機制的設置,以及錯誤的記錄,目前這個項目基本能夠實現直接運行一次性跑通整個流程。 前言 之前研究數據,零零散散的寫過一些數據抓取的爬蟲,不過寫的比較隨意。有很多地方現在看起來并不是很合理 這段時間比較閑,本來是想給之前的項目做重構的。后來 利用這...
閱讀 3747·2023-04-25 18:41
閱讀 1180·2021-11-11 16:55
閱讀 1840·2021-09-22 15:54
閱讀 3075·2021-09-22 15:51
閱讀 3551·2019-08-30 15:55
閱讀 1947·2019-08-30 14:19
閱讀 1287·2019-08-29 10:57
閱讀 1708·2019-08-29 10:56