KOA基础篇(一)

起步

npm i koa复制代码

路由

npm i koa-router复制代码

const Koa = require('koa');
const Router = require('koa-router');

let app = new Koa();
let router = new Router();

app.get('/',async ctx => {
    ctx.body = 'Index Page';
})
app.use(router.routes());
app.listen(3000);复制代码

嵌套路由

const Koa = require('koa');
const Router = require('koa-router');

let app = new Koa();
let router = new Router();

let userRouter = new Router();
userRouter.get('/', async ctx=>{
    ctx.body = 'user';
})
    let company = new Router();
    company.get('a',ctx=>{
        ctx.body = 'company Page';
    })

    let admin = new Router();
    admin.get('b',ctx=>{
        ctx.body = 'admin Page';
    })

userRouter.use(company.routes());
userRouter.use(admin.routes());

router.use(userRouter.routes());

app.use(router.routes());
app.listen(3000);复制代码

路由参数

const Koa = require('koa');
const Router = require('koa-router');

let app = new Koa();
let router = new Router();

app.get('/user/:id',async ctx => {
    // 参数可以从ctx中的params中获取
    console.log(ctx.params);
    
    //获取id的值
    let { id } = ctx.params;

    console.log(id);
})
app.use(router.routes());
app.listen(3000);复制代码

urlencoded传路由参数与params传路由参数

urlencoded格式: http://www.baidu.com/user?id=xxx

获取urlencoded路由的参数

const Koa = require('koa');
const Router = require('koa-router');

let app = new Koa();
let router = new Router();

app.get('/user/',async ctx => {
    // urlencoded传参数可以从ctx中的query中获取
    console.log(ctx.query);
    
    //获取id的值
    let { id } = ctx.query;

    console.log(id);
})
app.use(router.routes());
app.listen(3000);复制代码

params格式: http:/www.baidu.com/user/12 12=>:id

app.context

app.context是app服务中ctx的原型,如果需要添加全局组件,或者全局变量,可以使用app.context来设置全局

const Koa = require('koa');
const Router = require('koa-router');

let app = new Koa();

// 将数据库设置为全局
app.context.db = mysql.createPool();
let router = new Router();

app.get('/',async ctx => {
   ctx.db.query('xxxxxxxx');
})

app.use(router.routes());
app.listen(3000);复制代码

ctx中常用的信息

  • ctx.method   //请求方式
  • ctx.url    //url
  • ctx.path    
  • ctx.params    //路由参数
  • ctx.query    //get提交的参数
  • ctx.ip    //客户端ip
  • ctx.headers    //请求头



ctx中常用的方法

  • ctx.throw(state,msg)  //处理错误方法,state为状态码,msg为提示信息
const Koa = require('koa');
const Router = require('koa-router');

let app = new Koa();

// 将数据库设置为全局
app.context.db = mysql.createPool();
let router = new Router();

app.get('/login',async ctx => {
   let { username,password } = ctx.query;
    if( !username || !password ){
        ctx.throw(404,'username and password are required');
    }
})

app.use(router.routes());
app.listen(3000);复制代码

  • ctx.assert(条件,state,msg)
const Koa = require('koa');
const Router = require('koa-router');

let app = new Koa();

// 将数据库设置为全局
app.context.db = mysql.createPool();
let router = new Router();

app.get('/login',async ctx => {
    ctx.assert(ctx.query.username,404,'username is required');
    ctx.assert(ctx.query.password,404,'password is required');

    ctx.body= ' success ';
})

app.use(router.routes());
app.listen(3000);复制代码
  • ctx.state

ctx.state = 404复制代码

  • ctx.attachment()
  • ctx.redireact()

ctx.redireact('/register');
ctx.redireact('http://www.baidu.com');复制代码

static

koa不自带static,需要安装koa-static

npm i koa-static复制代码

const Koa = require('koa');
const Router = require('koa-router');
const static = require('koa-static');

let app = new Koa();

let router = new Router();

app.use(static('./static',{
    maxage: 17*86400*100; //缓存时间
    index: 'index.html'; //跟文件
})

app.use(router.routes());
app.listen(3000);复制代码

const Koa=require('koa');
const Router=require('koa-router');
const static=require('koa-static');

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

//
let router=new Router();

router.get('/user', async ctx=>{
});

server.use(router.routes());

let staticRouter=new Router();
staticRouter.all(/(\.jpg|\.png|\.gif)$/i, static('./static', {
  maxage: 60*86400*1000
}));
staticRouter.all(/(\.css)$/i, static('./static', {
  maxage: 1*86400*1000
}));
staticRouter.all(/(\.html|\.htm|\.shtml)$/i, static('./static', {
  maxage: 20*86400*1000
}));
staticRouter.all('', static('./static', {
  maxage: 30*86400*1000
}));

server.use(staticRouter.routes());复制代码

koa-better-body中间件

koa-better-body能够解析上传的文件以及普通的post数据

const Koa=require('koa');
const Router=require('koa-router');
const body=require('koa-better-body');

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

server.use(body({
  // 文件上传的路径
  uploadDir: './static/upload'
}));

server.use(async ctx=>{
  //文件和post数据信息都在ctx.request.fields里面
  console.log(ctx.request.fields);

  ctx.body='aaa';
});
复制代码

cookie

koa自带cookie

const Koa=require('koa');
const Router=require('koa-router');

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

// 循环秘钥
server.keys=[
  'sdfasdfasdfsadfasddfsdaf',
  'gutryurtyhfddyt8uytug',
  'tyutryur687tyuyujghjkhj',
];
server.use(async ctx=>{
  ctx.cookies.set('user', 'blue', {
    signed: true
    // 还可以加httpOnly,domain,maxAge等等
    });

  console.log(ctx.cookies.get('user', {
    // 校验cookie
    signed: true
  }));
});
复制代码

session

npm i koa-session复制代码

const Koa=require('koa');
const Router=require('koa-router');
const session=require('koa-session');

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

// 循环秘钥
server.keys=[
  'asdfasdfasdfasdfasdf',
  'hghjfgjghjkyggfytyurt',
  'hjghjkfguig8ygyi8t78i8',
];

server.use(session({
  maxAge: 20*60*1000,   //有效期
  renew: true           //自动续期
}, server));


server.use(async ctx=>{
  // session信息可以在ctx.session中寻找
  if(!ctx.session['view']){
    ctx.session['view']=0;
  }

  ctx.session['view']++;

  ctx.body=`欢迎你第${ctx.session.view}次来访`;
});
复制代码

MySQL

database.js

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

let conn=mysql.createPool({
  host: 'localhost',
  user: 'root',
  password: '',
  database: '20181101'
});
let db=co(conn);

module.exports=db;
复制代码

app.js

const Koa=require('koa');
const Router=require('koa-router');

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

server.context.db=require('./libs/database');

server.use(async (ctx, next)=>{
    try{
        let data = await ctx.db.query('SELECT * FROM user');
        console.log(data);
    }catch(err){
        console.log(err);
    }
    
});

server.use(router.routes());复制代码

错误处理

const Koa=require('koa');
const Router=require('koa-router');

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

server.context.db=require('./libs/database');

/*
    在所有的use之前,处理普通的错误,因为执行了next(),所有下面所有的错误都会在该处被捕获
*/
server.use(async (ctx, next)=>{
  try{
    await next();
  }catch(e){
    ctx.body='错了';
  }
});


let router=new Router();

/*
    在所有路由之前,处理路由错误,* 表示所有路由
*/
router.all('*', async ctx=>{
  try{
    await next();
  }catch(e){
    ctx.body='错了-router';
  }
});

router.get('/a', async ctx=>{
  ctx.body=div.title;
});

server.use(router.routes());
复制代码


转载于:https://juejin.im/post/5ccc27f6f265da03555c8e9b

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供一些基本的步骤和代码示例来构建一个基于koa2的多人聊天室。 1. 安装koa2和socket.io 因为我们的聊天室要使用socket.io实现实时通讯,所以我们需要安装koa2和socket.io。可以使用以下命令: ``` npm install koa koa-router koa-bodyparser socket.io ``` 2. 创建服务器 我们需要创建一个koa2服务器,并使用socket.io进行实时通讯。下面是一个简单的koa2服务器示例: ```javascript const Koa = require('koa'); const app = new Koa(); const http = require('http').Server(app.callback()); const io = require('socket.io')(http); io.on('connection', (socket) => { console.log('a user connected'); socket.on('disconnect', () => { console.log('user disconnected'); }); }); http.listen(3000, () => { console.log('listening on *:3000'); }); ``` 3. 处理用户连接和断开连接 当用户连接到服务器时,我们需要将其添加到聊天室中,并向其他用户广播新用户的连接。当用户断开连接时,我们需要从聊天室中删除该用户,并向其他用户广播该用户的断开连接。 ```javascript const users = []; io.on('connection', (socket) => { console.log('a user connected'); // 添加用户到聊天室中,并向其他用户广播新用户的连接 socket.on('add user', (username) => { socket.username = username; users.push(username); io.emit('user joined', username, users); }); // 从聊天室中删除用户,并向其他用户广播该用户的断开连接 socket.on('disconnect', () => { console.log('user disconnected'); const index = users.indexOf(socket.username); if (index !== -1) { users.splice(index, 1); io.emit('user left', socket.username, users); } }); }); ``` 4. 处理用户发送消息 当用户发送消息时,我们需要将其广播给所有其他用户。下面是处理用户发送消息的代码: ```javascript io.on('connection', (socket) => { console.log('a user connected'); socket.on('add user', (username) => { socket.username = username; users.push(username); io.emit('user joined', username, users); }); socket.on('chat message', (msg) => { io.emit('chat message', socket.username, msg); }); socket.on('disconnect', () => { console.log('user disconnected'); const index = users.indexOf(socket.username); if (index !== -1) { users.splice(index, 1); io.emit('user left', socket.username, users); } }); }); ``` 5. 创建前端页面 最后,我们需要创建一个前端页面,让用户可以在页面上输入用户名和消息,并实时看到其他用户发送的消息。下面是一个简单的前端页面示例: ```html <!DOCTYPE html> <html> <head> <title>Chat Room</title> </head> <body> <ul id="messages"></ul> <form id="chat-form"> <input id="username" type="text" placeholder="Username" /> <input id="message" type="text" placeholder="Message" /> <button>Send</button> </form> <script src="/socket.io/socket.io.js"></script> <script> const socket = io(); // 添加用户到聊天室中 socket.emit('add user', prompt('Enter your username:')); // 显示其他用户的连接和断开连接消息 socket.on('user joined', (username, users) => { showMessage(`${username} joined the chat room. Current users: ${users.join(', ')}`); }); socket.on('user left', (username, users) => { showMessage(`${username} left the chat room. Current users: ${users.join(', ')}`); }); // 显示其他用户发送的消息 socket.on('chat message', (username, msg) => { showMessage(`${username}: ${msg}`); }); // 处理用户发送消息 const form = document.getElementById('chat-form'); form.addEventListener('submit', (e) => { e.preventDefault(); const username = document.getElementById('username').value; const message = document.getElementById('message').value; socket.emit('chat message', message); showMessage(`You: ${message}`); document.getElementById('message').value = ''; }); // 显示消息 function showMessage(msg) { const li = document.createElement('li'); li.textContent = msg; document.getElementById('messages').appendChild(li); } </script> </body> </html> ``` 这就是一个基于koa2和socket.io的简单多人聊天室的实现。当然,这只是一个基本的代码示例,您可以根据您的需求进行自定义和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值