get请求的接收
const Koa = require('koa');
const app = new Koa()
app.use(async(ctx) => {
let url = ctx.url;
// request用来处理别人发的请求,是一个对象
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(3001,()=>{
console.log('[demo] server is starting at port 3000');
});
ctx的request对象里面可以拿到query和querystring,在ctx里面也可以拿到query和querystring。
const Koa = require('koa');
const app = new Koa();
app.use(async(ctx) => {
if (ctx.url === '/' && ctx.method === 'GET') {
ctx.body = `
<h1>Jspang koa2 request post<h1>
<form method="post">
<p>name</p>
<input name="userName" /> <br />
<p>age</p>
<input name="userAge" /> <br />
<p>website</p>
<input name="userwebSite" /> <br />
<button type="submit">submit</button>
<form>
`
} else if (ctx.url === '/' && ctx.method === 'POST') {
let postData = await parsePostData(ctx)
// 这里拿到postdata的数据
ctx.body = postData
} else {
ctx.body = `<h1>404!</h1>`
}
});
function parsePostData (ctx) {
return new Promise ((resolve, reject) => {
try {
let postData = '';
// addListener是原生的
ctx.req.addListener('data', (data) => {
postData += data
})
// on是koa的
ctx.req.on('end', () => {
resolve(postData)
})
} catch(error) {
reject(error)
//返回错误❌
}
})
}
app.listen(3000, () => {
console.log('3000 server start')
});
上面是一个小例子,通过ifelse来模拟了一下。
post的氢气步骤主要有三步:
- 解析上下文中ctx的原生nodejs对象request。
- 将post表单的数据解析成querystring的形式
- 最后,将字符串转换成json格式。
ctx.request 和ctx.req 的区别。
ctx.request 是koa2中context经过封装的对象,
ctx.req是context提供的nodejs的原生http请求对象。
ctx.method的参数有两个:GET 和 POST。
然后把获取到的字符串转换成json:
function parseStr(str) {
let queryData = {};
let strList = str.split('&');
for (let [index, str2] of strList.entries()) {
let itemList = str2.split('=');
queryData[itemList[0]] = decodeURIComponent(itemList[1]);
}
return queryData
}
ctx.req.on('end', () => {
let parsePostData = parseStr(postData);
resolve(parsePostData);
})
最后:使用中间件来接受post请求,很简单:
npm i --save koa-bodyparser
这个轮子会打转换好的json对象放到ctx.request.body里面。
使用如下:
const bodyparser = require('koa-bodyparser');
app.use(bodyparser());
let postData = ctx.request.body;
// 这里拿到postdata的数据
ctx.body = postData;