摘要:路由封裝了和變量傳入將要處理的下一個(gè)異步函數(shù)由標(biāo)記的函數(shù)稱(chēng)為異步函數(shù),在異步函數(shù)中,可以用調(diào)用另一個(gè)異步函數(shù),這兩個(gè)關(guān)鍵字將在中引入。
koa2.x learning 路由 koa-router
const router = require("koa-router")()
ctx:封裝了request 和 response變量
next: 傳入將要處理的下一個(gè)異步函數(shù)
由async標(biāo)記的函數(shù)稱(chēng)為異步函數(shù),在異步函數(shù)中,可以用await調(diào)用另一個(gè)異步函數(shù),這兩個(gè)關(guān)鍵字將在ES7中引入。
${ctx.request.url} 輸出 請(qǐng)求的url 地址 ctx.url相當(dāng)于ctx.request.url,ctx.type相當(dāng)于ctx.response.type
處理路由器的操作分為:views、 string、 json、 處理get請(qǐng)求、 處理post請(qǐng)求
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請(qǐng)求
var name = ctx.params.name;
router.get("/info/:name", async (ctx, next) => { var name = ctx.params.name; ctx.response.body = `處理post請(qǐng)求Hello, ${name}!
`; })
var name = ctx.request.body.name || "";
需要引入 koa-bodyparser 中間件, 創(chuàng)建 info.pug 用于處理表單
extends layout block content h1= title form(action="/signin" method="post") p= "用戶(hù)名:" 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: "用戶(hù)信息" }); }) // 處理post請(qǐng)求 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開(kāi)發(fā)的一個(gè)純JavaScript編寫(xiě)的模板引擎 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 // 開(kāi)發(fā)環(huán)境下 } }));
// 模塊 {% extends "base.html" %} {% block body %}操作cookieNo body{% endblock %} // 循環(huán) {% for msg in data %}{{ msg }}
{% endfor %} {% if hungry %} I am hungry {% elif tired %} I am tired {% else %} I am good! {% endif %}
koa提供了從上下文直接讀取、寫(xiě)入cookie的方法:
ctx.cookies.get(name, [options]) 讀取上下文請(qǐng)求中的cookie
ctx.cookies.set(name, value, [options]) 在上下文中寫(xiě)入cookie
// 處理cookie router.get("/cookie", async (ctx,next) => { const options = { domain:"127.0.0.1", path:"/", maxAge: 10 * 60 * 1000, // cookie有效時(shí)長(zhǎng) expires: new Date("2019-02-02"), // cookie失效時(shí)間 httpOnly: false, // 是否只用于http請(qǐng)求中獲取 overwrite: false // 是否允許重寫(xiě) } ctx.cookies.set("id","test cookie",options) ctx.response.body = `操作sessioncookies, ${ctx.cookies.get("id")}
`; // 輸出cookie值 })
將session存放在MySQL數(shù)據(jù)庫(kù)中 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") // 配置存儲(chǔ)session let store = new MysqlSession({ user: "root", password: "", database: "test", host: "127.0.0.1", }) let cookie = { maxAge: "", // cookie有效時(shí)長(zhǎng) expires: "", // cookie失效時(shí)間 path: "", // 寫(xiě)cookie所在的路徑 domain: "", // 寫(xiě)cookie所在的域名 httpOnly: "", // 是否只用于http請(qǐng)求中獲取 overwrite: "", // 是否允許重寫(xiě) 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"
用戶(hù)增、刪、改、查
// 查詢(xún) 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]; // 數(shù)組 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]; // 數(shù)組 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...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/93104.html
摘要:用搭建前端項(xiàng)目用搭建后臺(tái),給前端提供數(shù)據(jù)訪問(wèn)接口項(xiàng)目結(jié)構(gòu)用搭建的項(xiàng)目,紅色框中是新建的文件夾用于存放剩下的文件在寫(xiě)項(xiàng)目中慢慢增加,最初就是這樣的之后將項(xiàng)目跑起來(lái),看一下有沒(méi)有問(wèn)題這里就當(dāng)作沒(méi)有問(wèn)題前端這里選用和搭配這里采用的是的完整 koa2+vue 用vue-cli搭建前端項(xiàng)目 用koa2搭建后臺(tái),給前端提供數(shù)據(jù)訪問(wèn)接口 項(xiàng)目結(jié)構(gòu) showImg(https://segmentf...
摘要:接上次挖的坑,對(duì)相關(guān)的源碼進(jìn)行分析第一篇。和同為一批人進(jìn)行開(kāi)發(fā),與相比,顯得非常的迷你。在接收到一個(gè)請(qǐng)求后,會(huì)拿之前提到的與來(lái)創(chuàng)建本次請(qǐng)求所使用的上下文。以及如果沒(méi)有手動(dòng)指定,會(huì)默認(rèn)指定為。 接上次挖的坑,對(duì)koa2.x相關(guān)的源碼進(jìn)行分析 第一篇。 不得不說(shuō),koa是一個(gè)很輕量、很優(yōu)雅的http框架,尤其是在2.x以后移除了co的引入,使其代碼變得更為清晰。 express和ko...
摘要:返回的結(jié)果是一個(gè)對(duì)象,類(lèi)似于表示本次后面執(zhí)行之后返回的結(jié)果。對(duì)象用于一個(gè)異步操作的最終完成或失敗及其結(jié)果值的表示簡(jiǎn)單點(diǎn)說(shuō)就是處理異步請(qǐng)求。源碼分析主要脈絡(luò)函數(shù)調(diào)用后,返回一個(gè)實(shí)例。參考鏈接解釋對(duì)象的用法的源碼及其用法 本文始發(fā)于我的個(gè)人博客,如需轉(zhuǎn)載請(qǐng)注明出處。為了更好的閱讀體驗(yàn),可以直接進(jìn)去我的個(gè)人博客看。 前言 知識(shí)儲(chǔ)備 閱讀本文需要對(duì)Generator和Promise有一個(gè)基本的...
摘要:目前這個(gè)爬蟲(chóng)還是比較簡(jiǎn)單的類(lèi)型的,直接抓取頁(yè)面,然后在頁(yè)面中提取數(shù)據(jù),保存數(shù)據(jù)到數(shù)據(jù)庫(kù)。總結(jié)寫(xiě)這個(gè)項(xiàng)目其實(shí)主要的難點(diǎn)在于程序穩(wěn)定性的控制,容錯(cuò)機(jī)制的設(shè)置,以及錯(cuò)誤的記錄,目前這個(gè)項(xiàng)目基本能夠?qū)崿F(xiàn)直接運(yùn)行一次性跑通整個(gè)流程。 前言 之前研究數(shù)據(jù),零零散散的寫(xiě)過(guò)一些數(shù)據(jù)抓取的爬蟲(chóng),不過(guò)寫(xiě)的比較隨意。有很多地方現(xiàn)在看起來(lái)并不是很合理 這段時(shí)間比較閑,本來(lái)是想給之前的項(xiàng)目做重構(gòu)的。后來(lái) 利用這...
閱讀 3745·2023-04-25 18:41
閱讀 1179·2021-11-11 16:55
閱讀 1833·2021-09-22 15:54
閱讀 3075·2021-09-22 15:51
閱讀 3548·2019-08-30 15:55
閱讀 1945·2019-08-30 14:19
閱讀 1284·2019-08-29 10:57
閱讀 1705·2019-08-29 10:56