摘要:路由封裝了和變量傳入將要處理的下一個異步函數(shù)由標(biāo)記的函數(shù)稱為異步函數(shù),在異步函數(shù)中,可以用調(diào)用另一個異步函數(shù),這兩個關(guān)鍵字將在中引入。
koa2.x learning 路由 koa-router
const router = require("koa-router")()
ctx:封裝了request 和 response變量
next: 傳入將要處理的下一個異步函數(shù)
由async標(biāo)記的函數(shù)稱為異步函數(shù),在異步函數(shù)中,可以用await調(diào)用另一個異步函數(shù),這兩個關(guān)鍵字將在ES7中引入。
${ctx.request.url} 輸出 請求的url 地址 ctx.url相當(dāng)于ctx.request.url,ctx.type相當(dāng)于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 中間件, 創(chuàng)建 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開發(fā)的一個純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 // 開發(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提供了從上下文直接讀取、寫入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數(shù)據(jù)庫中 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]; // 數(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)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/93104.html
摘要:用搭建前端項目用搭建后臺,給前端提供數(shù)據(jù)訪問接口項目結(jié)構(gòu)用搭建的項目,紅色框中是新建的文件夾用于存放剩下的文件在寫項目中慢慢增加,最初就是這樣的之后將項目跑起來,看一下有沒有問題這里就當(dāng)作沒有問題前端這里選用和搭配這里采用的是的完整 koa2+vue 用vue-cli搭建前端項目 用koa2搭建后臺,給前端提供數(shù)據(jù)訪問接口 項目結(jié)構(gòu) showImg(https://segmentf...
摘要:接上次挖的坑,對相關(guān)的源碼進行分析第一篇。和同為一批人進行開發(fā),與相比,顯得非常的迷你。在接收到一個請求后,會拿之前提到的與來創(chuàng)建本次請求所使用的上下文。以及如果沒有手動指定,會默認指定為。 接上次挖的坑,對koa2.x相關(guān)的源碼進行分析 第一篇。 不得不說,koa是一個很輕量、很優(yōu)雅的http框架,尤其是在2.x以后移除了co的引入,使其代碼變得更為清晰。 express和ko...
摘要:返回的結(jié)果是一個對象,類似于表示本次后面執(zhí)行之后返回的結(jié)果。對象用于一個異步操作的最終完成或失敗及其結(jié)果值的表示簡單點說就是處理異步請求。源碼分析主要脈絡(luò)函數(shù)調(diào)用后,返回一個實例。參考鏈接解釋對象的用法的源碼及其用法 本文始發(fā)于我的個人博客,如需轉(zhuǎn)載請注明出處。為了更好的閱讀體驗,可以直接進去我的個人博客看。 前言 知識儲備 閱讀本文需要對Generator和Promise有一個基本的...
摘要:目前這個爬蟲還是比較簡單的類型的,直接抓取頁面,然后在頁面中提取數(shù)據(jù),保存數(shù)據(jù)到數(shù)據(jù)庫??偨Y(jié)寫這個項目其實主要的難點在于程序穩(wěn)定性的控制,容錯機制的設(shè)置,以及錯誤的記錄,目前這個項目基本能夠?qū)崿F(xiàn)直接運行一次性跑通整個流程。 前言 之前研究數(shù)據(jù),零零散散的寫過一些數(shù)據(jù)抓取的爬蟲,不過寫的比較隨意。有很多地方現(xiàn)在看起來并不是很合理 這段時間比較閑,本來是想給之前的項目做重構(gòu)的。后來 利用這...
閱讀 3752·2023-04-25 18:41
閱讀 1188·2021-11-11 16:55
閱讀 1845·2021-09-22 15:54
閱讀 3077·2021-09-22 15:51
閱讀 3555·2019-08-30 15:55
閱讀 1949·2019-08-30 14:19
閱讀 1294·2019-08-29 10:57
閱讀 1711·2019-08-29 10:56