随着技术的不断发展,前端工程师也被赋予了愈来愈多的职责。再也不是从前只须要切个图,加个css样式就能完成任务的切图仔了。接下来这篇文章,完成一个简单的登陆注册,能让你快速上手,成为一个‘小全栈工程师’,here we go !javascript
// 初始化package.json
npm init
// 安装koa2
npm install koa
复制代码
新建一个index.js,敲上如下代码css
//index.js
const Koa = require('koa')
const app = new Koa()
app.use( async (ctx, next) => {
ctx.response.body = '你好,我是内地吴彦祖'
})
app.listen(3333, ()=>{
console.log('server is running at http://localhost:3333')
})
复制代码
在咱们的命令行敲上html
node index.js
复制代码
就能够看到运行结果啦:前端
在上面的代码中,咱们能够看到app.use后面使用了2个参数,ctx和next,下面咱们介绍一个这哥俩到底干吗的java
ctx做为上下文使用,Koa将 node 的 request, response 对象封装进一个单独对象。即ctx.request 、 ctx.response。Koa 内部又对一些经常使用的属性或者方法作了代理操做,使得咱们能够直接经过 ctx 获取。好比,ctx.request.url 能够写成 ctx.url。node
next 参数的做用是将处理的控制权转交给下一个中间件git
经典的洋葱图概念能很好的解释next的执行,请求从最外层进去,又从最里层出来。咱们看一个例子github
const Koa = require('koa')
const app = new Koa()
app.use(async (ctx, next)=>{
let startTime = new Date().getTime()
await next()
let endTime = new Date().getTime()
console.log(`这次的响应时间为:${endTime - startTime}ms`)
})
app.use(async (ctx, next) => {
console.log('111, 而后doSomething')
await next()
console.log('111 end')
})
app.use(async (ctx, next) => {
console.log('222, 而后doSomething')
await next()
console.log('222 end')
})
app.use(async (ctx, next) => {
console.log('333, 而后doSomething')
await next()
console.log('333 end')
})
app.listen(3333, ()=>{
console.log('server is running at http://localhost:3333')
})
复制代码
看一下运行结果:chrome
若是将**‘222’**函数的next()去掉的话,会发生什么呢?npm
能够看到,后面的**‘333’**中间件直接不执行了。因此中间件的顺序对next的执行有很大的影响
咱们经常使用koa-router来处理URL
安装
npm i koa-router --save
复制代码
看一个例子:
const Koa = require('koa')
const app = new Koa()
const Router = require('koa-router')
const router = new Router()
router.get('/', async (ctx, next) => {
ctx.body = '你好,我这里是index页'
})
router.get('/user', async (ctx, next) => {
ctx.body = '你好,我这里是user页'
})
router.get('/error', async (ctx, next) => {
ctx.body = '你好,我这里是error页'
})
app.use(router.routes())
app.listen(3333, ()=>{
console.log('server is running at http://localhost:3333')
})
复制代码
koa-router也支持嵌套写法,经过一个总路由装载全部子路由,也很是的方便。看一个例子:
const Koa = require('koa')
const app = new Koa()
const Router = require('koa-router')
// 子路由1
let oneRouter = new Router()
oneRouter.get('/', async (ctx, next) => {
ctx.body = '你好,我这里是oneRouter页'
})
// 子路由2
let twoRouter = new Router()
twoRouter.get('/', async (ctx, next) => {
ctx.body = '你好, 我这里是twoRouter页'
}).get('/home', async (ctx , next) => {
ctx.body = '你好, 我这里是home页'
})
// 装载全部子路由
let indexRouter = new Router()
indexRouter.use('/one',oneRouter.routes(), oneRouter.allowedMethods())
indexRouter.use('/two',twoRouter.routes(), twoRouter.allowedMethods())
app
.use(indexRouter.routes())
.use(indexRouter.allowedMethods())
app.listen(3333, ()=>{
console.log('server is running at http://localhost:3333')
})
复制代码
看一下运行结果:
koa-router提供了常见的 .get .put .post .del 接口来处理各类需求。实际开发中咱们用的比较多的是get和post,咱们来看看get例子:
const Koa = require('koa')
const app = new Koa()
const Router = require('koa-router')
const router = new Router()
router.get('/data', async (ctx , next)=> {
let url = ctx.url
// 从ctx的request中拿到咱们想要的数据
let data = ctx.request.query
let dataQueryString = ctx.request.querystring
ctx.body = {
url,
data,
dataQueryString
}
})
app.use(router.routes())
app.listen(3333, ()=>{
console.log('server is running at http://localhost:3333')
})
复制代码
在浏览器里输入http://localhost:3333/data?user=wuyanzu&id=123456 ,能够看到运行结果
能够看到区别,.query
返回的结果是对象,而.querystring
返回的是字符串,这个很好理解。(chrome插件显示成json格式)
若是听从 RESTful 规范,好比请求要以 '/user/:id'的方式发出的话,咱们能够用下面的例子来获取到想要的数据
添加代码
router.get('/data/:id', async (ctx, next) => {
// 也从ctx中拿到咱们想要的数据,不过使用的是params对象
let data = ctx.params
ctx.body = data
})
复制代码
浏览器运行 http://localhost:3333/data/4396 看到结果
接下来咱们看看post的例子
咱们经常使用的请求post,它的数据是放在body当中的。这个时候就推荐一个很是经常使用且好用的中间件-koa-bodyparser
首先安装
npm i koa-bodyparser --save
复制代码
而后咱们在刚才的代码里添加
router.get('/post', async (ctx, next) => {
// 模拟一段提交页面
let html = ` <form action="/post/result" method="post"> <p>你长的最像哪位明星</p> <input name="name" type="text" placeholder="请输入名字:"/> <br/> <p>输入一段你知道的车牌号</p> <input name="num" type="text" placeholder="请输入车牌号:"/> <br/> <button>肯定不改了哦</button> </form> `
ctx.body = html
})
router.post('/post/result', async (ctx, next) => {
// 咱们能够从ctx的request.body拿到提交上来的数据
let {name, num} = ctx.request.body
if (name && num) {
ctx.body = `hello,你最像的明星是:${name},ch你知道的车牌号是:${num}`
} else {
ctx.body = '啊哦~你填写的信息有误'
}
})
复制代码
看一下运行结果
koa操做cookie是很是方便的,也是从上下文ctx中获取。
在咱们刚才的post请求的代码中加入:
router.post('/post/result', async (ctx, next) => {
// 咱们能够从ctx的request.body拿到提交上来的数据
let {name, num} = ctx.request.body
if (name && num) {
ctx.body = `hello,你最像的明星是:${name},ch你知道的车牌号是:${num}`
ctx.cookies.set(
'xunleiCode',num,
{
domain: 'localhost', // 写cookie所在的域名
path: '/post/result', // 写cookie所在的路径
maxAge: 10 * 60 * 1000, // cookie有效时长
expires: new Date('2018-09-17'), // cookie失效时间
httpOnly: false, // 是否只用于http请求中获取
overwrite: false // 是否容许重写
}
)
} else {
ctx.body = '啊哦~你填写的信息有误'
}
})
复制代码
看一下运行结果:
koa操做session的话,须要用到koa-session,🌰:
const session = require('koa-session')
app.keys = ['some secret hurr'];
const CONFIG = {
key: 'koa:sess', //cookie key (default is koa:sess)
maxAge: 86400000, // cookie的过时时间 maxAge in ms (default is 1 days)
overwrite: true, //是否能够overwrite (默认default true)
httpOnly: true, //cookie是否只有服务器端能够访问 httpOnly or not (default true)
signed: true, //签名默认true
rolling: false, //在每次请求时强行设置cookie,这将重置cookie过时时间(默认:false)
renew: false, //(boolean) renew session when session is nearly expired,
};
app.use(session(CONFIG, app));
复制代码
在涉及到本身没有接触过的领域时,我一直推崇先看看要怎么玩,等本身会玩了之后,再看看“究竟”怎么玩。咱们经过上面的代码和描述,已经对koa及node有一个初步的印象和概念。下篇文章咱们会有中间件的拆分,单元测试,记录日志,管理规范等。让咱们共同成长!
本文发布于薄荷前端周刊,欢迎Watch & Star ★,转载请注明出处。