iKcamp|基于Koa2搭建Node.js实战(含视频)☞ HTTP请求
POST/GET请求——常见请求方式处理
?? iKcamp 制作团队
原创作者:大哼、阿干、三三、小虎、胖子、小哈、DDU、可木、晃晃 文案校对:李益、大力萌、Au、DDU、小溪里、小哈 风采主播:可木、阿干、Au、DDU、小哈 视频剪辑:小溪里 主站运营:给力xi、xty 教程主编:张利涛
视频地址:https://www.cctalk.com/v/15114357765870
文章
Http 请求
在学习了
koa-router
之后,我们就可以用它来处理一些常见的请求了,比如POST/GET
。
koa-router
提供了 .get
、.post
、.put
和 .del
接口来处理各种请求,但实际业务上,我们大部分只会接触到 POST
和 GET
,所以接下来只针对这两种请求类型来说明。
当我们捕获到请求后,一般都需要把请求带过来的数据解析出来。数据传递过来的方式一般有三种:
请求参数放在 URL
后面
http://localhost:3000/home?id=12&name=ikcamp
koa-router
封装的 request
对象,里面的 query
方法或 querystring
方法可以直接获取到 Get
请求的数据,唯一不同的是 query
返回的是对象,而 querystring
返回的是字符串。
修改 app.js
,我们加入解析方式:
const Koa = require('koa')
const router = require('koa-router')()
const app = new Koa()
router.get('/', async(ctx, next) => {
ctx.response.body = `<h1>index page</h1>`
})
router.get('/home', async(ctx, next) => {
console.log(ctx.request.query)
console.log(ctx.request.querystring)
ctx.response.body = '<h1>HOME page</h1>'
})
router.get('/404', async(ctx, next) => {
ctx.response.body = '<h1>404 Not Found</h1>'
})
// add router middleware:
app.use(router.routes())
app.listen(3000, () => {
console.log('server is running at http://localhost:3000')
})
运行代码,并通过浏览器访问 http://localhost:3000/home?id=12&name=ikcamp
,然后打开控制台会看到下面的输出内容:
{ id: '12', name: 'ikcamp' }
id=12&name=ikcamp
请求参数放在 URL
中间
http://localhost:3000/home/12/ikcamp
这种情况下,解析方式肯定与上面的不一样了,koa-router
会把请求参数解析在 params
对象上,我们修改 app.js
文件,增加新的路由来测试下:
// 增加如下代码
router.get('/home/:id/:name', async(ctx, next)=>{
console.log(ctx.params)
ctx.response.body = '<h1>HOME page /:id/:name</h1>'
})
运行代码,并通过浏览器访问 http://localhost:3000/home/12/ikcamp
,然后查看下控制台显示的日志信息:
{ id: '12', name: 'ikcamp' }
请求参数放在 body
中
当用 post
方式请求时,我们会遇到一个问题:post
请求通常都会通过表单或 JSON
形式发送,而无论是 Node
还是 Koa
,都 没有提供 解析 post
请求参数的功能。
koa-bodyparser 说:『是时候登场了!』
首先,安装 koa-bodyparser
包:
npm i koa-bodyparser -S
安装完成之后,我们需要在 app.js
中引入中间件并应用:
const Koa = require('koa')
const router = require('koa-router')()
const bodyParser = require('koa-bodyparser')
const app = new Koa()
app.use(bodyParser())
router.get('/', async(ctx, next) => {
ctx.response.body = `<h1>index page</h1>`
})
router.get('/home', async(ctx, next) => {
console.log(ctx.request.query)
console.log(ctx.request.querystring)
ctx.response.body = '<h1>HOME page</h1>'
})
router.get('/home/:id/:name', async(ctx, next)=>{
console.log(ctx.params)
ctx.response.body = '<h1>HOME page /:id/:name</h1>'
})
router.get('/404', async(ctx, next) => {
ctx.response.body = '<h1>404 Not Found</h1>'
})
app.use(router.routes())
app.listen(3000, () => {
console.log('server is running at http://localhost:3000')
})
然后我们来试着写一个简单的表单提交实例。修改 app.js
增加如下代码,实现增加表单页面的路由:
// 增加返回表单页面的路由
router.get('/user', async(ctx, next)=>{
ctx.response.body =
`
<form action="/user/register" method="post">
<input name="name" type="text" placeholder="请输入用户名:ikcamp"/>
<br/>
<input name="password" type="text" placeholder="请输入密码:123456"/>
<br/>
<button>GoGoGo</button>
</form>
`
})
继续修改 app.js
增加如下代码,实现 post
表单提交对应的路由:
// 增加响应表单请求的路由
router.post('/user/register',async(ctx, next)=>{
let {name, password} = ctx.request.body
if( name === 'ikcamp' && password === '123456' ){
ctx.response.body = `Hello, ${name}!`
}else{
ctx.response.body = '账号信息错误'
}
})
常见的几种请求,以及相应的参数传递解析,我们已经学习过了。下一节中,我们会把项目整理重构下,做个分层,并引入视图层。
推荐: 翻译项目Master的自述:
1. 干货|人人都是翻译项目的Master
2. iKcamp出品微信小程序教学共5章16小节汇总(含视频)
- Windows Server 2008 R2 搭建微信小程序
- insert事务产生duplicate key error引发的死锁分析
- 零基础入门深度学习 | 第六章:长短时记忆网络(LSTM)
- 第6章 I/O复用:select和poll函数
- 第7章 套接字选项
- 第8章 基本UDP套接字编程
- 第11章 名字与地址转换
- explicit_defaults_for_timestamp参数导致复制中断
- 剑指offer代码解析——面试题15求链表中倒数第K个结点
- 第15章 Unix域协议
- 第13章 守护进程和inetd超级服务器
- 第14章 高级I/O函数
- Python测试应用与工具
- 第16章 Sun RPC
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 深入解析==与equals()区别
- 工作中常用的十款idea插件
- Linux系统rsync数据同步服务介绍
- 清空表与删除表mysql
- Java虚拟机-JVM组成结构详解
- 解决Chunkize warning while installing gensim问题
- numpy的random模块
- MySQL如何快速生成千万数据量?
- Linux系统rsync实战操作
- SQL线程状态分析:processlist
- 解决Fatal error in launcher: Unable to create process using '"'
- 责任链设计模式:老哥用程序生孩子
- LAMP架构应用实战—Apache服务介绍与安装01
- Excel合并
- 自定义异常为什么性能差,我来告诉你