目錄
原理:
對於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請求對象。
實例:
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 {
console.log(ctx.req === ctx.request)
let postData = '';
ctx.req.addListener('data',(data)=>{
postData += data;
})
ctx.req.addListener('end',()=>{
let parseData = parseQueryStr(postData);
resolve(parseData)
})
}catch (err) {
reject(err)
}
})
}
/**
* 將POST請求的參數字符串解析成json
*/
function parseQueryStr(queryStr) {
console.log('queryStr',queryStr)
let queryData = {};
let queryStrList = queryStr.split('&');
console.log(queryStrList);
for(let [index,queryStr] of queryStrList.entries()){
console.log(index,queryStr)
let itemList = queryStr.split('=');
queryData[itemList[0]] = decodeURIComponent(itemList[1]);
}
return queryData
}
app.listen(3000, () => {
console.log('[demo] request post is starting at port 3000')
})