学了一段时间js,突然想实践一下。刚好公司有个小项目要做,就拿Koa2来做。不做真的不知道,做了也想不出来。踩了一堆新手坑。刚接触Koa2的时候,在认识Koa2之前,我也知道Express,可惜并没有在实战中使用。后来大家都说Koa是个比Express更牛逼的东西,于是抱着好(工)奇(死)意,直接去用Koa2。事实证明,这确实是一场死亡。本来我用PHP一天就能写出东西,结果我用了三天才搞定。安装最近Node.jsV8发布,原生支持async和await调用,所以直接升级了Node.js。按照Koa2的教程,安装很简单,我用的是yarn(真的比npm快)。yarnaddkoa默认安装Koa2.2。然后装了之后就懵了,文档上说要这样用。constKoa=require('koa')constapp=newKoa()//responseapp.use(ctx=>{ctx.body='HelloKoa'})app.listen(3000)我是按照代码,确实成功了。但是,我是否有可能必须在app.use中编写所有逻辑?对于中间件,我感觉自己被吓到了,吓得我赶紧往下看文档。原来Koa2是一个中间件模型。app.uses可以有很多,每一个app.use都会注册一个中间件,做特定的事情。每个中间件按顺序执行。一个经典的洋葱图可以解释这一切。那么,上面的例子可以改造成这样。app.use(async(ctx,next)=>{awaitnext()ctx.body='HelloKoa'})根据上面的洋葱,以heart为单位,next两边的语句在左边sideoftheonion在右边执行,很像Laravel的中间件。就是这样,我知道,所有的操作都不必写在同一个app.use中。然而,下一个问题来了,我是否必须将所有逻辑都写在一个文件中?MVC呢?MVC不也叫框架吗?你在开玩笑吧?(好吧,后来才知道Koa2不是装网站的框架。)既然没有MVC,那就自己动手吧。路由首先要处理的是路由问题。但是由于是第一次用这个产品写项目,时间紧,(伪)任务重。看了文档,发现有个中间件列表的链接,里面有各种开源的中间件。我想你能隔着屏幕听到我发出杠铃般的笑声。有一个很棒的中间件叫做koa-router。这就是这个产品的用途。varKoa=require('koa')varRouter=require('koa-router')varapp=newKoa()varrouter=newRouter()router.get('/',function(ctx,next){//ctx.router可用});app.use(router.routes())虽然把逻辑和app.use分开了,但是好像还是没有解决刚才的问题。承诺的MVC也没有出现。于是又搜索了一下,没有找到Controller的中间件。我一下子愣住了,我是不是玩脱了?又是一天,亲爱的。仔细想了半秒,还是自己用koa-router实现一个controller比较好。Controllerconstfs=require('fs')functionaddRoutes(router,routes){for(letrouteinroutes){switch(route.method){case:'post':router.post(route.uri,route.fn)console.log(`Registerposturl:${route.uri}`)breakcase:'get':router.get(route.uri,route.fn)console.log(`Registergeturl:${route.uri}`)打破默认值:console.log(`无效的url:${route}`)}}}functionaddControllers(router){letfiles=fs.readdirSync(__dirname+'/controllers')letcontrollerFiles=files.filter(f=>{returnf.endsWith('.js')})for(letcontrollerFileincontrollerFiles){console.log(`processcontroller:${controllerFile}...`)letroutes=require(__dirname+'/controllers')addRoutes(router,routes)}}module.exports=()=>{letrouter=require('koa-router')()addControllers(router)returnrouter.routes()}我通过控制器文件中,创建若干js文件来作Controllertouse这里稍微参考一下廖雪峰的文章。然后,我们只需要在控制器文件夹中添加适当的文件。例如,我们添加一个名为chart.js的文件,并编写这样的代码。lethello=async(ctx,next)=>{ctx.body='Hellothefuckingworld!'}module.exports=[{method:'get',uri:'hello',fn:hello,}]最后只需在app.js中注册中间件即可。此外,我们还需要能够对ctx中的内容进行处理,因为它存储的是原始内容。还是因为时间紧,任务重(急),还是用了koa-bodyparser。constbodyParser=require('koa-bodyparser')app.use(bodyParser())这里要提醒的是,这个产品一定要放在路由中间件的前面。ModelMVC的C已经解决了,接下来解决M的问题。这里我使用的是Sequelize。这个ORM与大多数ORM类似,所以这次没有陷阱。我在根目录下新建了config.js配置文件,然后新建了model.js来定义模型。constSequelize=require('sequelize')constconfig=require('./config').databases...module.exports={//models}View视图,我用的是一个叫koa-view的中间件。由于它使用了Nunjucks模板引擎,所以我对编写PHP还是比较熟悉的。constview=require('koa-view')constapp=Koa()app.use(view(__dirname+'/views'))//controllerletHello=(ctx,next)=>{ctx.render('hello',datas)}在'views'文件夹下定义对应的html文件即可。后记在这次尝试中,我终于在我的修补中想出了一个简单的MVC模型。赶在deadline之前完成,一波三折。学习新的技术,就这样,练练就好了==下面给出我的项目目录,供参考koa2/|+-controllers/|||+-图表.js|...|+-静态/|||+-js/|...|||+-样式/|||+-图片|...|+-浏览量/|||+-游戏.html|...|+-app.js|+-config.js|+-controller.js|+-model.js|+-package.json|+-yarn.lock|+-node_modules/菜鸟作品,望指正如有错误,万分感谢。喜欢我的文章,就请我喝杯奶茶吧~
