起步:
准备1个空白的文件夹作为我们的起手项目
npm init 初始化项目,生成package.json
npm i koa -S 安装koa依赖,官方默认安装的是koa2版本
新建一个index.js文件
目录结构如下:
![]()
node 运行js文件
编写index.js文件,作为我们的入口文件。
const koa = require('koa') //引入Koa
const app = new koa() //实例化我们引入的koa对象
//使用(注册)koa,又叫配置中间件服务
app.use(async (ctx, next) => {
ctx.body = '今天天气不错呀!' //ctx.body 用于向页面写入内容
})
app.listen(8080, () => {
console.log(`app is running at:localhost:8080`);
})//监听端口
部分参数的解释:
async关键字是ES7的语法,用来声明一个函数是异步的。
里面传入一个context的(ctx)的上下文对象,该对象里面包括一个请求对象request(req)和一个响应对象response(res)
ctx.request是context经过封装的请求对象,ctx.req是context提供的node.js原生HTTP请求对象,
同理ctx.response是context经过封装的响应对象,ctx.res是context提供的node.js原生HTTP响应对象。

这里的ctx对象到底是什么东西,里面有什么?我们不妨通过console.log(ctx)打印出来看一下,我们可以清晰的地看到在ctx这一个整的大对象里面它包含了一个request对象和一个response对象

async和await笔记
asynchronous 中文翻译过来是异步的意思,简写成async。
我们都知道async关键字是用声明一个函数是异步的,是es7的语法,对比普通函数声明的写法可以发现,其实就是普通函数前面多了一个async关键字,你是不是觉得好像也没啥子特别的呀?
不过经过async关键字修饰过的函数返回的是一个es6语法中异步的Promise对象,通过async关键字的修饰,可以将一个普通函数或者方法变成异步的。
这也是异步函数的独到之处,最光鲜靓丽的特点,当你启动异步函数时,它可是返回一个Promise对象哟。

至于await先不管它是干什么的用,至少我们会经常在别人的代码中看到它们,没错,他们一般都是像情侣搭档一样,一出现就一起出现的。
其实await是async和wait这2个关键字的缩写,这一点知道了,就会搞明白了为什么是await而不是wait,虽然翻译成中文都是等待的意思。
那await到底在等待些什么呢?其实await关键字等待的便是async异步函数执行的结果,它不仅可以等待接收一个Promise返回的对象,还可以接收一个普通函数的返回值。
因为await关键字会造成堵塞,所以await关键字必须放在async异步函数里面,这是官方大大说的。

async和await关键字最常用的就是在后端,一般都是在异步请求后端接口的时候使用。
我们既然知道了await关键字可以接收一个promise对象,还知道使用了async修饰函数后会变成一个异步函数,这个异步函数返回的是一个promise对象。
那么我们可以不使用async关键字来声明异步函数,但await关键字却可以接收到一个promise对象吗?确实可以的哦!讲到这里,是不是有点迷糊了呢?
因为我们知道了await关键字可以确实可以接收一个promise对象,其实我们可以这样做,在一个普通函数里面return一个new Promise()对象即可,这也是别人代码中常见的写法,特别在uniapp云函数开发中成为一种习惯。

我们可以得出一个结论:那就是return new Promise()对象等于使用async关键字来声明一个异步函数
koa2中处理get请求
get请求:这些ctx上下文对象里面的基本信息需要了解一下:
const koa = require('koa')
const app = new koa()
app.use(async(ctx, next) => {
let url = ctx.url //获取页面完整的请求路径
//从request中获取get请求
let req = ctx.request //获取整个req请求对象
let query = req.query //获取查询字符串,返回对象形式
//也可以直接这样写:let query = ctx.request.query
let querystring = req.querystring //获取查询字符串
ctx.body = { //将上述参数打印到页面
url,
query,
querystring
}
})
//监听端口
app.listen(3000,()=>{
console.log('server is running at: localhost:3000');
})
代码可能没太明白,看图最直接了,看看他们对应都是些什么信息

此外,我们不仅可以在request对象中获取到get请求的相关信息,此外,我们还可以在ctx上下文对象中获取get请求的基本信息。
const koa = require('koa')
const app = new koa()
app.use(async(ctx, next) => {
let url = ctx.url //获取页面完整的请求路径
//通过ctx上下文获取get请求的基本信息
let query = ctx.query
let querystring = ctx.querystring
ctx.body = { //将上述参数打印到页面
url,
query,
querystring
}
})
//监听端口
app.listen(3000,()=>{
console.log('server is running at: localhost:3000');
})
页面效果是一样的

结论:想要获取get请求的相关信息,我们既可以从request中获取get请求的相关信息,也可以通过ctx上下文获取get请求的基本信息,效果是一样是。
koa2中处理post请求
ctx.body 向页面写入内容
ctx.url 获取页面访问路径
ctx.method 获取页面发起的请求类型,是get请求还是post请求
post请求案例:模仿页面访问
const koa = require('koa')
const app = new koa()
app.use( async (ctx, next) => {
if(ctx.url === '/' && ctx.method === 'GET'){
//如果请求的是首页并且发起的是GET请求,显示如下页面内容
let html = `
<h1>用户登录界面</h1>
<form method='POST' action='/'>
<p>用户名</p>
<input type='text' name='userName' /><br/>
<p>密码</p>
<input type='password' name='password' /><br/>
<button type='submit'>登录</button>
</form>
`
ctx.body = html
}else if(ctx.url === '/' && ctx.method === 'POST'){
ctx.body = '接收到页面发过来的post参数'
}else{
ctx.body = '<h1>404 page not found!</h1>'
}
})
//监听端口
app.listen(3000,()=>{
console.log('server is running at: localhost:3000');
})

网友评论