-
创建服务并启动
// 引入模块 const Koa = require('koa'); const { port } = require('./config'); // 创建服务器实例 const app = new Koa() // 监听服务启动 app.listen(port,()=> { console.log('启动了'); })
-
创建路由和接参
引入koa-router 和 koa-body(解析body参数)子路由:
const Router = require('koa-router') const blog = new Router() blog.get('/',async ctx => { ctx.body = 'blog的id:' + ctx.query.id }) blog.get('/:id',async ctx => { ctx.body = 'blog的id:' + ctx.params.id }) blog.post('/',async ctx => { ctx.body = 'blog的提交内容是:' + ctx.request.body.key }) module.exports = blog
路由主文件:
const Router = require('koa-router') const router = new Router() // 具体路由 const home = require('./home') const blog = require('./blog') router.use('/',home.routes()) router.use('/blog',blog.routes()) module.exports = router
参数解析:
// 引入模块 const Koa = require('koa'); const { port } = require('./config'); const router = require('./router'); const koaBody = require('koa-body') // 创建服务器实例 const app = new Koa() // 挂载中间件 // 解析参数需要在路由挂载之前 app.use(koaBody({ multipart:true, // formDate格式传参需要开启 formidable: { // 更多关于multipart的配置 keepExtensions:true, onFileBegin:(name,file) => { console.log(name,file); } } })) // 调用router.routes()来组装匹配好的路由,返回一个合并好的中间件 // 调用router.allowedMethods()获得一个中间件,当发送了不符合的请求时,会返回 `405 Method Not Allowed` 或 `501 Not Implemented` app.use(router.routes()).use(router.allowedMethods( // throw: true, // 抛出错误,代替设置响应头状态 // notImplemented: () => '不支持当前请求所需要的功能', // methodNotAllowed: () => '不支持的请求方式' )) // 监听服务启动 app.listen(port,()=> { console.log('启动了'); })
注:koa-body和koa-bodyparser等具体解析,可参考此处
-
中间件挂在顺序
中间件遇到await next(),会向下执行下一个中间件,直到没有 await next(),原路返回,执行每个中间件await next()后的逻辑。 -
静态资源配置
引入 koa-static// 引入模块 const Koa = require('koa'); const { port } = require('./config'); const router = require('./router'); const koaBody = require('koa-body') const static = require('koa-static') const path = require('path') // 创建服务器实例 const app = new Koa() // 挂载中间件 app.use(static(path.join(__dirname,'static'))) app.use(static(path.join(__dirname,'public')))
注:可设置多大静态资源库,会按由上到下顺序,进行资源访问。
-
数据库
本次采用的是mongodb数据库const MongoClient = require('mongodb').MongoClient const { dbUrl, dbName } = require('../config/index') class Db { constructor(){ this.instance = '' // 数据库对象 this.connect() } // 解决总是重复链接问题 static getInstance() { if (!Db.instance) { Db.instance = new Db() } return Db.instance } // 数据库链接 async connect() { if (!this.instance) { const client = await MongoClient.connect(dbUrl) this.instance = client.db(dbName) console.log('链接成功'); } } // 查找数据 async find(collectionName,json) { return await this.instance.collection(collectionName).find(json).toArray() } // 插入数据 async insert(collectionName,json) { return await this.instance.collection(collectionName).insert(json) } } module.exports = Db.getInstance()
更多参考链接:
- https://www.itying.com/koa/article-index-id-60.html – koa中文文档
- https://www.kancloud.cn/luponu/mongoose/870695 – mongoose 中文文档