const Koa = require('koa')
const app = new Koa()
app.use(async (ctx,next)=>{
console.log(ctx.path)//request与ctx等效
console.log(ctx.method)
//路由
if(ctx.path === "/classic/latest"&&ctx.method ==="GET"){
ctx.body = {key:'classic'}
}
})
app.listen(3000)//端口号
运行代码之后,我们可以看到浏览器中出现json
{
"key":"classic"
}
在大型项目中,使用if编写路由非常繁琐,因此我们可以采用第三方路由系统koa-router
const Koa = require('koa')
const Router = require('koa-router')//koa-router文档:koa-router npm
//根据数据类型划分主题
const app = new Koa()
const router = new Router()
//第三方路由系统koa-router
router.get('/classic/latest',(ctx,next)=>{
ctx.body = {key:'classic'}
})
//get查询 post新增 put更新 delete删除
app.use(router.routes())
app.listen(3000)//端口号
服务器api是需要考虑客户端兼容性,需要兼容多个版本。api请求需要携带版本号,方法如下:
在island目录下新建api文件夹,api文件夹下再新建文件夹v1用来存放v1版本的APIclassic.js和book.js
//app.js
const Koa = require('koa')
const classic = require('./api/v1/classic')
const book = require('./api/v1/book')
const app = new Koa()
app.use(classic.routes())
app.use(book.routes())
app.listen(3000)//端口号
//classic.js
const Router = require('koa-router')
const router = new Router()
router.get('/v1/classic/latest',(ctx,next)=>{
ctx.body = {
key:'classic'
}
})
module.exports = router
//book.js
const Router = require('koa-router')
const router = new Router()
router.get('/v1/book/latest',(ctx,next)=>{
ctx.body = {
key:'book'
}
})
module.exports = router
通过在浏览器中输入http://localhost:3000/v1/book/latest和http://localhost:3000/v1/classic/latest即可获取不同路由的返回值
全局安装nodemon npm i nodemon -g
执行 nodemon app.js 即可实现代码修改后自动重启nodeserver
//app.js
const Koa = require('koa')
const Router = require('koa-router')
const requireDirectory = require('require-directory')
const app = new Koa()
const modules = requireDirectory(module,'./api',{
visit:whenLoadModule
})
function whenLoadModule(obj){
if(obj instanceof Router){
app.use(obj.routes())
}
}
app.listen(3000)//端口号
为了以后代码维护方便,我们可以将自动注册路由的代码放在初始化管理器中
//core/init.js
const Router = require('koa-router')
const requireDirectory = require('require-directory')
//初始化管理器
class InitManager{
static initCore(app){
//入口方法
InitManager.app = app
InitManager.initLoadRouters()//调用静态方法
}
static initLoadRouters(){
//path config
const apiDirectory = `${process.cwd()}/app/api`//ES6模板字符串 process.cwd获取根目录
requireDirectory(module,apiDirectory,{
visit:whenLoadModule
})
function whenLoadModule(obj){
if(obj instanceof Router){
InitManager.app.use(obj.routes())
}
}
}
}
module.exports = InitManager
同时,也减少了app.js中的代码量
const Koa = require('koa')
const Initmanager = require('./core/init')
const app = new Koa()
Initmanager.initCore(app)
app.listen(3001)//端口号