Koa学习笔记:http请求处理

4. 处理HTTP请求

1. 简单处理HTTP

中间件处理请求

// router.js
async function handleReq(ctx, next) {
  // 通过ctx.req.url可以请求的url
  ctx.body = ctx.req.url.replace(/(\/)/gi, ' ');
  await next();
}

module.exports = { handleReq };

详细request内包含的属性可查看: Koa2 context.request

2. Get请求
  • 处理Get请求
// queryRequest.js
const Koa = require('koa');
const app = new Koa();
const Router = require('koa-router');

const apiRouter = new Router();

apiRouter.get('/getName', async ctx => {
  const { id } = ctx.query;
  const nameList = ['Jack', 'Mike', 'Mary', 'Joe'];

  try {
    ctx.body = {
      name: nameList[+id]
    };
  } catch (error) {
    console.log(error);
    ctx.body = {
      error
    };
  }
});

app.use(apiRouter.routes(), apiRouter.allowedMethods());

app.listen(3000, () => {
  console.log('koa server is running in port 3000');
});
  • 结果

Koa学习笔记:http请求处理_第1张图片

3. Post请求
  • 通过监控req的data和end事件来接受post数据,并将post表单数据转为queryString
// queryRequest.js
// 手动获取post数据
const parsePostData = ctx =>
  new Promise((resolve, reject) => {
    let postData = '';
    // post请求将post表单的数据转换为queryString
    ctx.req.addListener('data', data => {
      postData += data;
    });
	// 以end为queryString结束的标志
    ctx.req.addListener('end', () => {
      const obj = queryString.parse(postData);
      resolve(obj);
    });
  });

// 加载表单模板(为了测试post请求结果)
apiRouter.get('/', async ctx => {
  const html = await getFileContent('./view/post.html');
  ctx.body = html;
});

// post
apiRouter.post('/postName', async ctx => {
  let postData = await parsePostData(ctx);
  ctx.body = postData;
});

app.use(apiRouter.routes(), apiRouter.allowedMethods());

app.listen(3000, () => {
  console.log('koa server is running in port 3000');
});

  • 结果

Koa学习笔记:http请求处理_第2张图片

  • 点击提交

Koa学习笔记:http请求处理_第3张图片

4. bodyParser处理Post请求
1. 安装koa-bodyParser
yarn add koa-bodyparser
2. 导入koa-bodyparser中间件
  • bodyParser是将queryString进行打包, 然后将处理完的结果存到ctx.req.body中
  • 处理Post请求
const bodyParser = require('koa-bodyparser');
app.use(bodyParser());

// 这里添加了koa-router
apiRouter.get('/body', async ctx => {
  const html = await getFileContent('./view/bodyParser.html');
  ctx.body = html;
});

// use koa-bodyparser
apiRouter.post('/body/postName', async ctx => {
  // ctx.request.body中是由该中间件向其中添加的
  let postData = ctx.request.body;
  ctx.body = postData;
});

Notes: 如果添加了koa-bodyparser之前通过监控ctx.req中的data和end的事件的获取post参数的方法可能失效

参考

koa2 设计模式-学习笔记

koa 官网

koa2 进阶学习笔记

你可能感兴趣的:(Koa笔记,Koa,处理请求)