使用Koa提供API服务
2020-04-27 本文已影响0人
Yes_no
使用koa提供API服务
安装koa依赖
npm install --save koa
创建 index.js 文件并运行
const Koa = require('koa') //引入koa
const app = new Koa() //创建一个koa实例
// 每一个http请求,koa将调用我们传入的异步函数来处理
app.use(async(ctx) => { ctx.body = 'Hello Koa' })
app.listen(3000) //监听3000端口
console.log('app is starting at 127.0.0.1:3000') //启动提示信息
ctx变量
ctx是由koa传入的封装了request和response的变量,我们可以通过它访问request和response
async (ctx, next) => {
await next(); // 调用下一个middleware
// 设置response的Content-Type:
ctx.response.type = 'text/html';
// 设置response的内容:
ctx.response.body = '<h1>Hello, koa2!</h1>';
}
为什么要调用await next()
koa把很多async函数组成一个处理链,每个async函数都可以做一些自己的事情,然后用await next()来调用下一个async函数。我们把每个async函数称为middleware,这些middleware可以组合起来,完成很多有用的功能。
app.use(async (ctx, next) => {
console.log(`${ctx.request.method} ${ctx.request.url}`); // 打印URL
await next(); // 调用下一个middleware
});
app.use(async (ctx, next) => {
const start = new Date().getTime(); // 当前时间
await next(); // 调用下一个middleware
const ms = new Date().getTime() - start; // 耗费时间
console.log(`Time: ${ms}ms`); // 打印耗费时间
});
app.use(async (ctx, next) => {
await next();
ctx.response.type = 'text/html';
ctx.response.body = '<h1>Hello, koa2!</h1>';
});
GET请求处理
app.use(async ctx => {
//从request中接收Get请求
let url = ctx.url;
let request = ctx.request;
let req_query = request.query //处理过
let req_queryString = request.querystring //未处理
//从上下文还中直接获取Get请求
let ctx_query = ctx.query
let ctx_queryString = ctx.querystring
ctx.body = {
url,
ctx_query,
ctx_queryString
}
})
get请求示例
POST请求处理
1.解析上下文ctx中的原生node.js对象req。
2.将POST表单数据解析成query string-字符串
(例如:user=jspang&age=18)
3.将字符串转换成JSON格式。
ctx.request 和 ctx.req的区别
ctx.request:是Koa2中context经过封装的请求对象,它用起来更直观和简单。
ctx.req:是context提供的node.js原生HTTP请求对象。这个虽然不那么直观,但是可以得到更多的内容,适合我们深度编程。
const Koa = require('koa')
const app = new Koa()
app.use(async(ctx)=> {
if (ctx.url === '/' && ctx.method === 'GET') {
// 显示表单页面
let html = `
<h1>Koa2 request POST</h1>
<form method="POST" action="/">
<p>userName</p>
<input name="userName" /><br/>
<p>age</p>
<input name="age" /><br/>
<p>website</p>
<input name="webSite" /><br/>
<button type="submit">submit</button>
`
ctx.body = html
} else if (ctx.url === '/' && ctx.method === 'POST') {
let postData = await parsePostData(ctx)
ctx.body = parseQueryStr(postData) //Json格式的参数
} else {
ctx.body = '<h1>404!</h1>'
}
})
//定义一个获取post请求参数的方法
function parsePostData(ctx){
return new Promise((resolve,reject)=>{
try{
//定义一个接收参数的变量
let postdata = ""
//监听data,并将接收到的data拼接入postdata变量
ctx.req.addListener('data',(data)=>{
postdata += data
})
//监听end,结束时返回拼接了参数的变量
ctx.req.on('end',()=>{
resolve(postdata)
})
}catch(error){ //报错时返回错误信息
reject(error)
}
})
}
// JSON格式转换
function parseQueryStr(queryStr){
let queryData = {} //存放json格式的对象
let queryStrList = queryStr.split('&') //将字符串按 & 拆分成数组
for(let [index,queryStr] of queryStrList.entries()){ // for(queryStr of queryStrList) 亦可
let itemList = queryStr.split('=') //将字符串按 = 拆分成数组
queryData[itemList[0]] = decodeURIComponent(itemList[1]) //键值的方式添加到定义的对象
}
return queryData
}
app.listen(3000,()=>{
console.log('127.0.0.1:3000')
})