手把手教你使用koa2
简介
koa是由express的原班人马打造的web框架。但是相对于express,koa的性能要更高,因为koa通过使用aysnc函数,帮你丢弃回调函数,并有力的增强了错误处理。而且koa没有绑定任何中间件,二十提供了一套优雅的方法,帮助你快死而愉快地编写服务端应用程序。
与express的区别
| 框架 | 推荐版本 | 是否自带中间件 | js语法 | 特性 |
| express | 4.x | 是 | es5 | 回调嵌套 |
| koa2 | 2.x | 否 | es7 | async/await+Promise |
安装
koa依赖的node>v7.6.0
npm i koa -D
要在 node < 7.6 版本的 Koa 中使用 async 方法, 我们推荐使用 babel's require hook.
创建hello world应用程序,在文件中创建server.js,文件内的代码如下
const Koa = require('koa');
const app = new Koa();
app.use(async ctx => {
ctx.body = 'Hello World';
});
app.listen(3000);
在终端中启动
node server.js
服务启动之后,在浏览器中输入localhost:3000,就会看到页面显示的是hello world的字样
路由
因为koa本身是不带任何中间件的,所以使用路由的话,我们需要安装koa的路由才行
npm i koa-router -D
使用
const Koa=require('koa');
const Router=require('koa-router');
let app=new Koa();
server.listen(8080);
let router=new Router();
router.get('/news', async (ctx, next)=>{
ctx.body='hello world';
await next();
});
app.use(router.routes());
启动服务后在浏览器地址栏打开:localhost:3000/news
请求方式
既然是服务端语言,做项目的时候,前后端通信肯定是少不了请求方式处理的
get请求
const koa = require('koa');
const Router = require('koa-router');
let server = new koa();
server.listen(2000, () => {
console.log('port 2000 is running');
})
// 创建路由
let router = new Router();
// koa里面习惯于用async await ,有next方法,但是非常的少用
router.get('/a', async ctx => {
//相当于 express的send
ctx.body = 'aaa';
console.log(ctx.body)
})
// 最后需要把路由添加到服务器上
server.use(router.routes())
post请求
post请求的话,需要使用到 koa-better-body模块
安装
npm i koa-better-body
我们这里使用文件上传作为例子,在文件目录下新建一个static文件夹,并且在static文件夹里面建一个upload文件夹
const koa=require('koa');
const body=require('koa-better-body');
const app=new koa();
app.listen(3000,()=>{
console.log('server is running...');
})
app.use(body({
uploadDir:'./static/upload'
}))
app.use(async ctx=>{
//文件和post数据
console.log(ctx.request.fields);
ctx.body='数据提交成功啦'
})
html文件中的表单使用的post请求
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<form action="http://localhost:3000/upload" method="post" enctype="multipart/form-data">
<div>
用户名:<input type="text" name="username">
</div>
<div>
密码:<input type="password" name="password">
</div>
<div>
文件:<input type="file" name="file">
</div>
<div>
<input type="submit" value="提交">
</div>
</form>
</body>
</html>
注意点:1 . 因为这边是文件上传,所以用到的是post请求,entype一定要写成multipart/form-data
2. 上传完成后在upload文件夹里面能看到你刚刚上传的文件,后缀名可能是不一定是你上传的文件的后缀名,这不是上传失败,这是正常的后缀名是给人看的,不是给机器看的
传递参数
koa传参有两种方式 urlencodeded 和 params两种方式
| query | params |
| 顺序灵活 | 顺序写死 |
| 可以省略 | 不能省略,否则会报not found |
| 不利于SEO | 利于SEO |
| http://aaa.com/user?a=12&b=5 | http://aaa.com/user/12/5 |
params 的实现方式 (http://localhost:3000/news/736273725)
const koa=require('koa');
const Router=require('koa-router');
const app=new koa();
const router=new Router();
app.listen(3000);
router.get('/news/:id',async (ctx,next)=>{
let {id}=ctx.params
ctx.body=id;
})
app.use(router.routes())
query传参(http://localhost:3000/users?username=Cynthia&address=%E5%B9%BF%E5%B7%9E)
const koa=require('koa');
const Router=require('koa-router');
const app=new koa();
const router=new Router();
app.listen(3000);
router.get('/news/:id',async (ctx,next)=>{
let {id}=ctx.params
ctx.body=id;
next()
})
app.use(router.routes());
上下文Context
Koa Context 将 node 的 request 和 response 对象封装到单个对象中,为编写 Web 应用程序和 API 提供了许多有用的方法。 这些操作在 HTTP 服务器开发中频繁使用,它们被添加到此级别而不是更高级别的框架,这将强制中间件重新实现此通用功能。
app.context相当于是ctx的原型(prototype).
常用:在使用数据库的时候,可以把数据库的对象添加到app.context上
const koa=require('koa');
const Router=require('koa-router');
const app=new koa();
// 添加数据库到全局
app.context.db=require('./libs/database');
// 因为所有的请求都会走这一步,所以在这边添加错误处理能提高性能
app.use(async (ctx, next)=>{
try{
await next();
}catch(e){
ctx.body='错了';
}
});
const router=new Router();
router.get('/a',async ctx=>{
// ctx.db.query(`SELECT * FROM user_table`,(err,data)=>{
// if(err) return err;
// console.log(data);
// })
// console.log(query)
console.log(ctx.db);
ctx.body='weqwe'
})
// 所有路由都会经过这里,所以在这边进行错误处理
router.all('',async ctx=>{
try{
await next();
}catch(e){
ctx.body='没有该路由'
}
})
app.use(router.routes());
app.listen(3000);
处理cookie
处理cookie的话,koa里面已经封装好了,所以不需要我们引入中间件
管理静态资源
前面已经说到过koa不带任何中间件,所以要管理静态资源的话,需要安装koa-static
const koa=require('koa');
const Router=require('koa-router');
const static=require('koa-static');
const app=new koa();
let router=new Router();
router.get('/user',async ctx=>{
ctx.body='用户'
})
app.use(router.routes());
app.listen(3000,()=>{
console.log('server is running....')
})
app.use(static('./static',{
maxAge:86400*1000,// 设置缓存时间
index:'1.html'// 根目录的时候打开这个文件
}))
在项目中,因为不同的文件,我们需要设置缓存的时间不一样,我们可以进行下面的操作
const Koa = require('koa');
const Router = require('koa-router');
const static = require('koa-static');
const app = new Koa();
app.listen(3000);
let router = new Router();
router.get('/user', async ctx => {
ctx = '用户'
})
app.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
}));
app.use(staticRouter.routes());
session
安装koa-seesion
const koa=require('koa');
const session=require('koa-session');
const app=new koa();
app.listen(3000,()=>{
console.log('port is running...')
})
app.keys=[
'eehuehuwehwue',
'eweyweywewyqeuw',
'dhsjdhasdasjd',
'sdsadasdsa'
]
app.use(session({
maxAge:60*20*1000,// 有效期
renew:true // 自动续期
},app))
app.use(async ctx=>{
if(!ctx.session['view']){
ctx.session['view']=1;
}
ctx.session['view']++
ctx.body=`欢迎你第${ctx.session.view}次来访`
})
手把手教你使用koa2的更多相关文章
- 手把手教你基于koa2,mongoose实现增删改查
初始化项目 npm init -y 先安装一波乱七八糟的依赖插件(需要具备一定的koa2知识,至于mongoDB自行百度安装教程),模板引擎我使用的是art-template(据说是性能最好的,而且是 ...
- 手把手教你做个人 app
我们都知道,开发一个app很大程度依赖服务端:服务端提供接口数据,然后我们展示:另外,开发一个app,还需要美工协助切图.没了接口,没了美工,app似乎只能做成单机版或工具类app,真的是这样的吗?先 ...
- 手把手教从零开始在GitHub上使用Hexo搭建博客教程(四)-使用Travis自动部署Hexo(2)
前言 前面一篇文章介绍了Travis自动部署Hexo的常规使用教程,也是个人比较推荐的方法. 前文最后也提到了在Windows系统中可能会有一些小问题,为了在Windows系统中也可以实现使用Trav ...
- 手把手教从零开始在GitHub上使用Hexo搭建博客教程(三)-使用Travis自动部署Hexo(1)
前言 前面两篇文章介绍了在github上使用hexo搭建博客的基本环境和hexo相关参数设置等. 基于目前,博客基本上是可以完美运行了. 但是,有一点是不太好,就是源码同步问题,如果在不同的电脑上写文 ...
- 手把手教从零开始在GitHub上使用Hexo搭建博客教程(二)-Hexo参数设置
前言 前文手把手教从零开始在GitHub上使用Hexo搭建博客教程(一)-附GitHub注册及配置介绍了github注册.git相关设置以及hexo基本操作. 本文主要介绍一下hexo的常用参数设置. ...
- 手把手教从零开始在GitHub上使用Hexo搭建博客教程(一)-附GitHub注册及配置
前言 有朋友问了我关于博客系统搭建相关的问题,由于是做开发相关的工作,我给他推荐的是使用github的gh-pages服务搭建个人博客. 推荐理由: 免费:github提供gh-pages服务是免费的 ...
- UWP Jenkins + NuGet + MSBuild 手把手教你做自动UWP Build 和 App store包
背景 项目上需要做UWP的自动安装包,在以前的公司接触的是TFS来做自动build. 公司要求用Jenkins来做,别笑话我,之前还真不晓得这个东西. 会的同学请看一下指出错误,不会的同学请先自行脑补 ...
- 推荐!手把手教你使用Git
推荐!手把手教你使用Git 原文出处: 涂根华的博客 http://blog.jobbole.com/78960/ 一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 二:SVN与 ...
- 手把手教你写Sublime中的Snippet
手把手教你写Sublime中的Snippet Sublime Text号称最性感的编辑器, 并且越来越多人使用, 美观, 高效 关于如何使用Sublime text可以参考我的另一篇文章, 相信你会喜 ...
随机推荐
- JAVA对象的初始化过程
出处:http://blog.csdn.net/andrew323/article/details/4665379 下面我们通过两个例题来说明对象的实例化过程. 例1: 编译并运行该程序会有以下输 ...
- Android开发中常见的内存泄露案例以及解决方法总结
1.单例模式引起的内存泄露 由于单例模式的静态特性,使得它的生命周期和我们的应用一样长,如果让单例无限制的持有Activity的强引用就会导致内存泄漏如错误代码示例: public class Use ...
- jmeter 常用内置变量
1. vars API:http://jmeter.apache.org/api/org/apache/jmeter/threads/JMeterVariables.html vars.get(& ...
- 检查cpu是否支持VT-X(HAXM)
可以使用CPU-Z进行检测,CPU是否支持VT-X,如果不支持,就不要浪费时间安装HAXM了. 可以试一下Genymotion模拟器.
- BZOJ 3143 游走(贪心+期望+高斯消元)
一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编号的分 ...
- ava8并发教程:Threads和Executors
原文地址 原文作者:Benjamin Winterberg 译者:张坤 欢迎阅读我的Java8并发教程的第一部分.这份指南将会以简单易懂的代码示例来教给你如何在Java8中进行并发编程.这是一系列教 ...
- 响应式开发(六)-----Bootstrap CSS----------Bootstrap文本排版
Bootstrap 使用 Helvetica Neue. Helvetica. Arial 和 sans-serif 作为其默认的字体栈.使用 Bootstrap 的排版特性,您可以创建标题.段落.列 ...
- java多线程 -- 原子量 变量 CAS
多线程原子性问题的产生和解决 原子变量:在 java.util.concurrent.atomic 包下提供了一些原子变量. 1. volatile 保证内存可见性,可以查看atomic中变量是使用v ...
- NOIP2015D2总结
今天居然考了一套题.NOIP2015D2. 这是当年的战绩: 360的一等奖线.好强啊! 之前做过2015的D1,但我确实不会做landlord……今天曾祥瑞学长和林可学姐都来了,他们说,朱昶宇AK, ...
- mac下Android Studio使用及快捷键
1.Android Studio使用及快捷键 (1)我们新建一个项目后进入界面,左侧可以选择Project或Android,一般选Project会比较习惯以前eclipse的显示 (2)点击左上角An ...