因为之前没涉及到后端知识,另外Node.js的资料确实比较少,并且解决方案比较多,express,koa,koa2,think,egg等等。
由于公司使用PHP的缘故,所以从PHP切入到后端,学会了ThinkPHP5,所以以此为跳板来学习Koa2。
今天主要是学习使用Koa2的路由中间件koa-router, 我看阮一峰老师推出的教程用的是koa-route,我比较了下,koa-route的用法简单些,但是功能少了些。所以还是使用koa-router。
其实可以看一下原生koa2的路由配置写法:
const Koa = require('koa')
const app = new Koa()
const fs = require('fs')
function render(viewUrl) {
return new Promise((resolve, reject) => {
// fs模块中的第二个参数,可以是String,也可以是Object
// 用来指定字符编码,如果未指定,返回原始的buffer。(不设置也是可以访问html的)
fs.readFile(`./view/${viewUrl}`, 'binary', (err, data) => {
if (err) {
reject(err)
} else {
resolve(data)
}
})
})
}
async function route(url) {
let viewUrl
switch (url) {
case '/':
viewUrl= 'index.html'
break
case '/index':
viewUrl= 'index.html'
break
case '/hello':
viewUrl= 'hello.html'
break
default:
viewUrl= '404.html'
break
}
return await render(viewUrl)
}
app.use(async (ctx) => {
let url = ctx.request.url
let html = await route(url)
ctx.body = html
})
app.listen(3000)
console.log('The project is starting at port 3000')
比较麻烦。
所以可以使用koa-router
用法:
1,基础用法
const Koa = require('koa')
const app = new Koa()
const Router = require('koa-router')
// 需要实例化
const router = new Router()
router.get('/', ctx => {
ctx.body = '这是index页面'
})
// 需要加载中间件
// router.routes() 返回一个中间件
app.use(router.routes())
app.listen(3000)
2,多路由
const Koa = require('koa')
const app = new Koa()
const Router = require('koa-router')
// 需要实例化
const index = new Router()
index.get('/', ctx => {
ctx.body = '这是index页面'
})
const product = new Router()
product.get('/food', ctx => {
ctx.body = 'food页面'
}).get('/drink', ctx => {
ctx.body = 'drink页面'
})
// 需要先把各子路由装载到总的router中
const router = new Router()
// 装载的时候是use,不是get
router.use('/', index.routes())
router.use('/product', product.routes())
// 需要加载中间件
// router.routes() 返回一个中间件
app.use(router.routes())
app.listen(3000)
3, 重定向
const Koa = require('koa')
const app = new Koa()
const Router = require('koa-router')
const router = new Router()
router.get('/hello', ctx => {
ctx.body = '我是吐蕃国师鸠摩智'
})
router.redirect('/sb', 'hello')
// 想当于
//router.all('/sb', function (ctx) {
// ctx.redirect('/hello');
// ctx.status = 301;
//});
app.use(router.routes())
app.listen(3000)
4,前缀prefix
const Koa = require('koa')
const app = new Koa()
const Router = require('koa-router')
const router = new Router({
'prefix': '/spawn'
})
router.get('/hello', ctx => {
ctx.body = '我是吐蕃国师鸠摩智'
})
app.use(router.routes())
app.listen(3000)