请求数据获取
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(5000, () => {
console.log('[demo] request get is starting at port 3000');
});
POST 请求参数获取
原理
对于 POST 请求的处理,koa2 没有封装获取参数的方法,需要通过解析上下文 context 中的原生 node.js 请求对象 req,将 POST 表单数据解析成 query string(例如:a=1&b=2&c=3),再将 query string 解析成 JSON 格式(例如:{"a":"1", "b":"2", "c":"3"})
注意:ctx.request 是 context 经过封装的请求对象,ctx.req 是 context 提供的 node.js 原生 HTTP 请求对象,同理 ctx.response 是 context 经过封装的响应对象,ctx.res 是 context 提供的 node.js 原生 HTTP 响应对象。
解析出 POST 请求上下文中的表单数据
const Koa = require('koa');
const app = new Koa();
app.use(async ctx => {
if (ctx.url === '/' && ctx.method === 'GET') {
// 当GET请求时候返回表单页面
let html = `
<h1>koa2 request post demo</h1>
<form method="POST" action="/">
<p>userName</p>
<input name="userName" /><br/>
<p>nickName</p>
<input name="nickName" /><br/>
<p>email</p>
<input name="email" /><br/>
<button type="submit">submit</button>
</form>
`;
ctx.body = html;
} else if (ctx.url === '/' && ctx.method === 'POST') {
// 当POST请求的时候,解析POST表单里的数据,并显示出来
let postData = await parsePostData(ctx);
ctx.body = postData;
} else {
// 其他请求显示404
ctx.body = '<h1>404!!! o(╯□╰)o</h1>';
}
});
// 解析上下文里node原生请求的POST参数
function parsePostData(ctx) {
return new Promise((resolve, reject) => {
try {
let postdata = '';
ctx.req.addListener('data', data => {
postdata += data;
});
ctx.req.addListener('end', function () {
let parseData = parseQueryStr(postdata);
resolve(parseData);
});
} catch (err) {
reject(err);
}
});
}
// 将POST请求参数字符串解析成JSON
function parseQueryStr(queryStr) {
let queryData = {};
let queryStrList = queryStr.split('&');
console.log(queryStrList);
for (let [index, queryStr] of queryStrList.entries()) {
let itemList = queryStr.split('=');
queryData[itemList[0]] = decodeURIComponent(itemList[1]);
}
return queryData;
}
app.listen(5000, () => {
console.log('[demo] request post is starting at port 3000');
});
koa-bodyparser 中间件
原理
对于 POST 请求的处理,koa-bodyparser 中间件可以把 koa2 上下文的 formData 数据解析到 ctx.request.body 中
const Koa = require('koa');
const app = new Koa();
const bodyParser = require('koa-bodyparser');
// 使用ctx.body解析中间件
app.use(bodyParser());
app.use(async ctx => {
if (ctx.url === '/' && ctx.method === 'GET') {
// 当GET请求时候返回表单页面
let html = `
<h1>koa2 request post demo</h1>
<form method="POST" action="/">
<p>userName</p>
<input name="userName" /><br/>
<p>nickName</p>
<input name="nickName" /><br/>
<p>email</p>
<input name="email" /><br/>
<button type="submit">submit</button>
</form>
`;
ctx.body = html;
} else if (ctx.url === '/' && ctx.method === 'POST') {
// 当POST请求的时候,中间件koa-bodyparser解析POST表单里的数据,并显示出来
let postData = ctx.request.body;
ctx.body = postData;
} else {
// 其他请求显示404
ctx.body = '<h1>404!!! o(╯□╰)o</h1>';
}
});
app.listen(5000, () => {
console.log('[demo] request post is starting at port 3000');
});