GET
在koa2中GET请求通过request接收,接受的方法有两种:query
和querystring
。
query
:返回的是格式化好的参数对象。
querystring
:返回的是请求字符串。
下面举个例子就可以很清楚的看到两者的区别:
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')
})
除了在ctx.request
中获取Get请求外,还可以直接在ctx中得到GET请求,也分为query和querystring,结果与ctx.request
是一样的。
const Koa = require('koa')
const app = new Koa()
app.use(async(ctx)=>{
let url =ctx.url
//从request中获取GET请求
let request =ctx.request
let req_query = request.query
let req_querystring = request.querystring
//从上下文中直接获取
let ctx_query = ctx.query
let ctx_querystring = ctx.querystring
ctx.body={
url,
req_query,
req_querystring,
ctx_query,
ctx_querystring
}
})
app.listen(3000,()=>{
console.log('server is starting at port 3000');
})
POST
【ctx.request和ctx.req的区别】
ctx.request
是koa2中context经过封装的请求对象,它用起来更直观和简单。
ctx.req
是context提供的node.js原生HTTP请求对象,虽然不那么直观,但是可以得到更多的内容,更适合深度编程。
对于POST请求的处理,koa2没有封装方便的获取参数的方法,需要通过解析上下文context中的原生node.js请求对象req来获取。
获取POST请求的步骤:
1、解析上下文ctx中的原生nodex.js对象req。
2、将POST表单数据解析成query string-字符串(如:name=zyb&age23)。
3、将字符串转换成JSON格式。
【ctx.method】
koa2中提供了ctx.method
属性,可以得到请求的类型,然后根据请求类型编写相应的方法,这在工作中非常常用。我们先来作个小例子,根据请求类型获得不同的页面内容。GET请求时得到表单填写页面,POST请求时,得到POST处理页面。
const Koa = require('koa')
const app = new Koa()
app.use(async(ctx)=>{
//当请求时GET请求时,显示表单让用户填写
if(ctx.url==='/' && ctx.method === 'GET'){
let html =`
<h1>Koa2 request post demo</h1>
<form method="POST" action="/">
<p>userName</p>
<input name="userName" /> <br/>
<p>age</p>
<input name="age" /> <br/>
<button type="submit">submit</button>
</form>
`
ctx.body =html
//当请求时POST请求时
}else if(ctx.url==='/' && ctx.method === 'POST'){
ctx.body='接收到请求'
}else{
//其它请求显示404页面
ctx.body='<h1>404!</h1>'
}
})
app.listen(3000,()=>{
console.log('server is starting at port 3000')
})
接下来进一步扩展,将获取到的表单格式化。
const Koa = require('koa')
const app = new Koa()
app.use(async(ctx)=>{
if(ctx.url==='/' && ctx.method==='GET'){
//显示表单页面
let html=`
<h1>Koa2 request post demo</h1>
<form method="POST" action="/">
<p>userName</p>
<input name="userName" /><br/>
<p>age</p>
<input name="age" /><br/>
<button type="submit">submit</button>
</form>
`
ctx.body=html
}else if(ctx.url==='/' && ctx.method==='POST'){
let pastData=await parsePostData(ctx)
ctx.body=pastData
}else{
ctx.body='<h1>404!</h1>'
}
})
function parsePostData(ctx){
return new Promise((resolve,reject)=>{
try{
let postdata=""
ctx.req.on('data',(data)=>{
postdata += data
})
ctx.req.addListener("end",function(){
let parseData = parseQueryStr( postdata )
resolve(parseData)
})
}catch(error){
reject(error)
}
})
}
function parseQueryStr(queryStr){
let queryData={}
let queryStrList = queryStr.split('&')
for( let [index,queryStr] of queryStrList.entries() ){
let itemList = queryStr.split('=')
queryData[itemList[0]] = decodeURIComponent(itemList[1])
}
return queryData
}
app.listen(8000,()=>{
console.log('server is starting at port 8000')
})
parsePostData(ctx)
使用了ctx.req.on
来接收事件,难点是用了ES6的Promise来处理,然后用parseQueryStr(queryStr)
将"name=zyb&age23"格式的字符串转化为JSON。