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請求
views
router.get(`/`, async (ctx, next) => {
await ctx.render(`index`, {
title: `Hello Koa 2!`
})
})
string
router.get(`/string`,async (ctx, next) =>{
ctx.response.body = `<h1>welcome, hello</h1>`;
})
json
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 = `<h1>Hello, ${name}!</h1>`;
})
處理post請求
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 = `<h1>welcome, ${name}</h1>`;
}else{
ctx.response.body = `<h1>Login faild!</h1>
<p><a href="/">Login</a></p>
`
}
})
檢視 – views層
適用於 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 %} <div>No body</div> {% endblock %}
// 迴圈
{% for msg in data %}
<p>{{ msg }}</p>
{% endfor %}
{% if hungry %}
I am hungry
{% elif tired %}
I am tired
{% else %}
I am good!
{% endif %}
操作cookie
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 = `<h1>cookies, ${ctx.cookies.get(`id`)}</h1>`; // 輸出cookie值
})
操作session
將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 = `<h1>session, ${ctx.session.user_id}, ${ctx.session.count}</h1>`; // 輸出cookie值
})
操作mysql
安裝 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: