koa基礎實踐

 

1.訪問靜態文件: 使用中間件koa-static

const koa = require('koa');
const static = require('koa-static');

let server = new koa();
server.listen(8080);

// 訪問靜態文件
server.use(static('www'));

  在根目錄創建www文件夾,並新建1.html文件,瀏覽器訪問路徑 http://localhost:8080/1.html 可訪問到對應文件。

2.1訪問接口:使用中間件koa-route

const koa = require('koa');
const route = require('koa-route');
let server = new koa();
server.listen(8080);

//接口 /reg?user=xxx&psw=xxx
server.use(route.get('/reg',async (ctx,next)=>{
    ctx.response.body = 'hello world';
    console.log(ctx.request.query);
}));

//如何獲取路由參數
server.use(route.get('/catch/:user/:psw',async (ctx,username,psw,next)=>{
    ctx.response.body = 'hello,' + username;
    console.log(username,psw);
}));

瀏覽器訪問路徑 http://localhost:8080/reg?user=bboyjoe&psw=123456

node控制檯會輸出:

{user: 'bboyjoe', psw: '123456'}

瀏覽器訪問路徑 http://localhost:8080/catch/bboyjoe/123456

node控制檯會輸出:

bboyjoe 123456

2.2 訪問接口:使用中間件koa-router

const koa = require('koa');
const router = require('koa-router');
let server = new koa();
server.listen(8080);

let r1 = router();
server.use(r1.routes());

//接口 /login?user=xxx&psw=xxx
r1.get('/login',async (ctx,next)=>{
    console.log(ctx.url);
    ctx.response.body='登錄';
});

//接口 /reg/xxx/xxx
r1.get('/reg/:user/:psw',async (ctx,next)=>{
    console.log(ctx.params);
    ctx.response.body='註冊';
});

瀏覽器訪問路徑 http://localhost:8080/login?user=bboyjoe&psw=123456

node控制檯輸出:

/login?user=bboyjoe&psw=123456

瀏覽器訪問路徑 http://localhost:8080/reg/bboyjoe/123456

node控制檯輸出:

{user: 'bboyjoe', psw: '123456'}

3.自己寫一個訪問靜態文件的中間件:

 現在libs文件夾下創建my-static.js

const fs = require('fs');
const assert = require('assert');

module.exports = function (root) {
    assert(root,'argument root is required');
    assert(typeof root === 'string', 'root must be string');

    return async (ctx) => {
        ctx.response.body = await new Promise((resolve,reject)=>{
            fs.readFile(`${root}${ctx.request.path}`,(err,data)=>{
                if(err){
                    reject(err);
                }else{
                    resolve(data.toString());
                }
            })
        })
    }
}

在實際中引用my-static:

const koa = require('koa');
const myStatic = require('./libs/my-static');

let server = new koa();
server.listen(8080);

// 訪問靜態文件
server.use(myStatic('www'));

在根目錄創建www文件夾,並新建1.html文件,瀏覽器訪問路徑 http://localhost:8080/1.html 可訪問到對應文件。

4. 處理post數據:使用中間件koa-better-body來處理數據,使用koa-convert來兼容版本

<form action="http://localhost:8080/" method="post" enctype="multipart/form-data">
    <input type="text" name="username"><br/>
    <input type="password" name="psw"><br/>
    <input type="file" name="f1"><br/>
    <input type="submit" value="提交">
</form>
const koa = require('koa');
const body = require('koa-better-body');
const convert = require('koa-convert');

let server = new koa();
server.listen(8080);

server.use(convert(body({
    uploadDir: './upload/',
    keepExtensions: true
})));

server.use(async ctx=>{
   console.log('body: ',ctx.request.body);
   console.log('files: ',ctx.request.files);
   console.log('fields: ',ctx.request.fields);
});

瀏覽器訪問該表單頁面,並提交數據,可以得到包含文件在內的數據。

5. cookie操作

const koa = require('koa');

let server = new koa();
server.listen(8080);

//cookie加簽名
server.keys = ['jfdsakljhfgklashgkjh','iouoifoknhkjfklsdjflk','zjfjhasofjoiujofdsf'];

server.use(async ctx=>{
    ctx.cookies.set('user','keven',{
        maxAge: 24*3600*1000,
        path: '/',
        domain: 'localhost',
        signed: true
    });
    console.log(ctx.cookies.get('user',{signed: true}));
})

瀏覽器訪問http://localhost:8080,F12查看相應cookie信息。

6.session操作:使用中間件koa-session

const koa = require('koa');
const session = require('koa-session');

let server = new koa();
server.listen(8080);
server.keys = ['fdsajklsjalkgjlk','uioweuojlgkjsdlkj','fkljflkjeruoiu'];
server.use(session({
    maxAge: 20*60*1000    //koa裏默認是一天
},server));

server.use(async ctx=>{
    if(!ctx.session['n']){
        ctx.session['n'] = 1;
    }else{
        ctx.session['n']++;
    }
   console.log(ctx.session);
   ctx.response.body = `這是你第${ctx.session['n']}次來訪`;
});

瀏覽器訪問http://localhost:8080,可在node控制檯查看結果

7.mysql操作:使用中間件koa-mysql

const koa = require('koa');
const mysql = require('koa-mysql');

let server = new koa();
server.listen(8080);

const db = mysql.createPool({host:'localhost',user:'root',password:'',port:3306,database: 'an_ju_ke'});

server.use(async ctx=>{
   let p = new Promise((resolve,reject)=>{
      let fn = db.query('SELECT * FROM house_table');
      fn(function (err,data) {
          if(err){
              reject(err);
          }else{
              resolve(data);
          }
      })
   });
   let datas = await p;
   console.log(datas);

   ctx.response.body = datas;
});

8.自己封裝mysql中間件:

const mysql = require('koa-mysql');

module.exports = {
    createPool(json){
        const db = mysql.createPool(json);
        let _query = db.query.bind(db);

        db.query = function (sql) {
            return new Promise((resolve,reject)=>{
                _query(sql)((err,data)=>{
                    if(err){
                        reject(err);
                    }else{
                        resolve(data);
                    }
                })
            })
        };

        return db;
    }
};
const koa = require('koa');
const mysql = require('./libs/koa-better-mysql');

let server = new koa();
server.listen(8080);

const db = mysql.createPool({host:'localhost',user:'root',password:'',port:3306,database: 'an_ju_ke'});

server.use(async ctx=>{
    let datas = await db.query('SELECT * FROM house_table');
    console.log(datas);
    ctx.response.body = datas;
});

9.服務端渲染:使用中間件koa-ejs

const koa = require('koa');
const mysql = require('./libs/koa-better-mysql');
const ejs = require('koa-ejs');

let db = mysql.createPool({ host: 'localhost', user: 'root', password: '', port: '3306', database: 'an_ju_ke'});
let server = new koa();
server.listen(8080);

ejs(server,{
    root: './template',
    layout: false,
    viewExt: 'ejs',
    cache: false,
    debug: true
});

server.use(async ctx=>{
    let houses = await db.query('SELECT * FROM house_table');
    await ctx.render('index',{
        houses
    })
})

 在template文件夾下創建index.ejs文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>ejs服務端渲染</title>
</head>
<body>
    <% houses.forEach(json=>{ %>
        <h4><%= json.title -%></h4>
    <% }); %>
</body>
</html>

瀏覽器訪問localhost:8080可查看效果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章