Koa -- 基于 Node.js 平台的下一代 web 开发框架
首先创建一个项目文件夹进行初始化
npm init -y
该命令执行后会生成一个package.json项目描述文件
安装koa
npm install koa --save
该命令执行后会生成node_modules文件夹(用来存放一些npm安装的依赖包)
在项目文件夹中新建一个app.js文件
const koa = require('koa');//引包
const app = new Koa(); app.use(async(ctx)=>{
ctx.body = 'hello world';//把输出的返回给前台
})
app.listen(3000)//监听端口
输入 node app.js ,按tab补全 回车,输入http://localhost:3000,这个服务就会跑起来
对于每一个http请求,koa将调用我们传入的异步函数来处理
async (ctx, next) => {
await next();
// 设置response的Content-Type:
ctx.response.type = 'text/html';
// 设置response的内容:
ctx.response.body = '<h1>Hello, 2019</h1>';
}
/*
这里的ctx是由koa传入的封装了request和response的变量,我们可以通过他来访问request和response
这里的next是koa传入的将要处理的下一个异步函数
上面的异步函数中,我们首先用await next();处理下一个异步函数,然后,设置response的Content-Type和内容
*/
Context 对象(简写ctx),表示一次对话的上下文(包括请求和回复),通过加工这个对象,就可以控制返回给用户的内容
由async标记的函数称为异步函数,在异步函数中,可以用await调用另一个异步函数
ctx对象中有一些简写的方法:
//ctx.url相当于ctx.request.url //ctx.type相当于ctx.response.type
get请求
const Koa = require('koa');
const app = new Koa();
app.use(async(ctx)=>{
let url =ctx.url;
let request =ctx.request;
let req_query = request.query;//返回的是格式化好的参数对象
let req_querystring = request.querystring;//返回的是请求字符串
ctx.body={
url,
req_query,
req_querystring
}
});
app.listen(3000,()=>{
console.log('server is starting at port 3000');
});
在koa2中GET请求通过ctx.request接收,但是接受的方法有两种:query和querystring
query返回的是格式化好的参数对象
ctx.request.query -> {key:val}
querystring返回的是请求字符串
ctx.request.querystring -> key=val&key=val //字符串 (查询信息,不包括问号)
栗子:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
用户名:<input type="text" id="user">
年龄:<input type="text" id="age">
<button id="btn">提交</button>
<script>
//get请求
btn.onclick = function(){
let obj = {
user:user.value,
age:age.value
}
fetch('/users?'+new URLSearchParams(obj).toString())
.then(d=>d.json())
.then(d=>{
console.log(d);
})
}
</script>
</body>
</html>
const koa = require('koa');
const app = new koa();
const router = require('koa-router')();
const static = require('koa-static');
const path = require('path'); let sql = [
{
name:'yi',
age:22
},
{
name:'er',
age:23
},
{
name:'san',
age:20
},
{
name:'si',
age:20
}
];
//user=jin&age=18 接口 router.get('/users',async(ctx)=>{ // console.log(ctx.query)
let mybody = ctx.query;
console.log(mybody)
let resobj = {code:0,msg:'成功'};
let exist = sql.find((e)=>mybody.user == e.name)
if(exist){
resobj.code = 1;
resobj.msg = '已经有了';
}
else{
sql.push({
name:mybody.user,
age:mybody.age
})
}
ctx.body = resobj; }) app.use(static(path.join(__dirname,'www')))
app.use(router.routes())
app.listen(2019,()=>{
console.log('已经启动服务器')
})
总结:
获得GET请求的方式有两种,一种是从request中获得,一种是一直从上下文中获得。
获得的格式也有两种:query和querystring
post请求
ctx.request与ctx.req之间的区别
前者从request中获取get请求,后者从上下文中直接获取
ctx.request是Koa2中context经过封装的请求对象,用起来更直观和简单
ctx.req是context提供的node.js原生HTTP请求对象
post请求时候可以使用 bodyParser 中间件
安装中间件
npm i koa-bodyparser -S
引包 使用
const bodyparser = require('koa-bodyparser');
app.use(bodyparser());
栗子
//post请求
btn.onclick = function(){
let obj = {
user:user.value,
age:age.value
}
fetch('/users',{
method:'post',
headers:{'Content-Type':'application/x-www-form-urlencoded'},
body:new URLSearchParams(obj).toString()
})
.then(d=>d.json())
.then(d=>{
console.log(d);
})
}
const koa = require('koa');
const app = new koa();
const router = require('koa-router')();
const static = require('koa-static');
const bodyParser = require('koa-bodyparser');
const path = require('path'); let sql = [
{
name:'yi',
age:22
},
{
name:'song',
age:23
}
]; router.post('/users',async(ctx)=>{ // console.log(ctx.query)
let mybody = ctx.request.body;
console.log(mybody)
let resobj = {code:0,msg:'成功'};
let exist = sql.find((e)=>mybody.user == e.name)
if(exist){
resobj.code = 1;
resobj.msg = '已经有了';
}
else{
sql.push({
name:mybody.user,
age:mybody.age
})
}
ctx.body = resobj; }) app.use(bodyParser())
app.use(static(path.join(__dirname,'www')))
app.use(router.routes())
app.listen(2019,()=>{
console.log('已经启动服务器')
})
get请求使用ctx.query,post请求使用ctx.body
路由
安装router(才能写接口)
npm i koa-router -S
引包
const router = require('koa-router')()
get方式(两种写法)
//第一种
router.get('/user',async(ctx)=>{
//这里面放get请求的逻辑
})
/*
第二种,在一个单独的文件里边写get请求的逻辑,在这里需要require引一下
*/
router.get('/user',require('../xxx'))
use引用
app.use(router.routes());
静态资源
安装
npm i koa-static -S
引入包
const static = require('koa-static');
const path = require('path');
使用static中间件,设置静态资源的目录
//路径指向 当前目录www
app.use(static(
path.join(__dirname,'www')
))