当前位置: 首页 > 后端技术 > Node.js

从零开始搭建Koa2Server

时间:2023-04-03 13:33:50 Node.js

前几天想写一个爬虫小程序,后端用的是koa2。于是翻遍了github和各大网站,没有找到好用的、轻量级的koa2脚手架,也没有找到更清晰的搭建介绍。github上的脚手架要么是1.x版本的koa,要么就是一堆复杂的依赖。当然,可能还有写的更好的,只是没找到。反正只能自己动手了,也算是学习了。下面介绍一下搭建过程,看看能不能方便入门的同学。第一步:初始项目,引入Koa2官方介绍,很简单。$npminstallkoaconstKoa=require('koa')constapp=newKoa()//responseapp.use(ctx=>{ctx.body='HelloKoa'})app.listen(3000)OK,那我们就从这里开始。创建一个文件夹并将其命名为koa2。(记得先安装nodev7.6.0或以上版本)cdkoa2npminit//一路回车,根据提示输入信息。npminstallkoa--save然后在文件根目录下新建一个程序入口文件:index.js,将官网介绍的代码粘贴进去。然后在命令行执行nodeindex.js,打开浏览器,访问http://localhost:3000/,可以看到页面输出了helloworld。好了,第一步已经迈出。相信大部分的小白在这里都还好,接下来就开始糊涂了。这个东西,接口应该怎么写呢?如何连接到数据库?Step2:构建路由,ControllerKoa本质上是调用一系列中间件来处理相应的请求,并决定是否传递给下一个中间件进行处理。让我们尝试编写最简单的中间件。//我们重写刚才index.js中的代码。app.use(ctx=>{ctx.body='HelloKoa'})//改成下面的app.use(ctx=>{ctx.body=`你的URL路径是:${ctx.request.url}`})这段代码中,app.use的功能是最简单的中间件,接受请求,读取请求路径,返回给客户端。重新执行nodeindex.js,打开浏览器,输入http://localhost:3000/hhhhh,页面输出你的URL路径为:hhhhh。所以接口的本质就是判断不同的请求链接,做不同的事情,返回相应的结果。然后我们需要一个路由中间件来处理分发请求。在开源时代,当然是一种主义。在github上搜索koa-router,成功找到。根据它的介绍,我们先在项目根目录执行npminstallkoa-router--save,然后修改index.js文件。变成如下:constKoa=require('koa')constRouter=require('koa-router')constapp=newKoa()constrouter=newRouter()//先注释,后面解释//constbodyParser=require('koa-bodyparser')//app.use(bodyParser())router.get('/',ctx=>{ctx.body=`这是主页`})router.get('/user',ctx=>{ctx.body=`这是用户页面`})router.get('/post',ctx=>{ctx.body=ctx.request.body})router.get('/async',asyncctx=>{constsleep=async(ms)=>{returnnewPromise(resolve=>{setTimeout(()=>{resolve(true)},ms)})}awaitsleep(1000)ctx.body=`这是一个异步处理页面`})app.use(router.routes()).use(router.allowedMethods())app.listen(3000)重新执行nodeindex.js。我们可以看到访问/、/user、/async可以得到相应的结果。除了post方法,你根本拿不到自己帖子的数据。因为koa很纯净,你提交的数据不会给你处理。所以这里必须要引用一个中间件来处理提交的数据——bodyparser。注释上面两行注释代码,处理请求数据。记得先npminstallkoa-bodyparser--save。另外,不懂async/await的同学可以去阮老师的介绍,点传送门。但是我们不能把所有的接口都写在这个文件里,所以我们要修改它。想一想,路由配置文件应该是一个单独的,接口方法应该按照业务模块划分成controller。去做就对了!我们先来看看修改后的目录结构。如果不想截图,直接看一下:-koa2-node_modules-controlleruser.js-index.js-router.js-package.json然后看看文件发生了怎样的变化。//index.jsconstKoa=require('koa')constapp=newKoa()constrouter=require('./router')constbodyParser=require('koa-bodyparser')app.use(bodyParser())app.use(router.routes()).use(router.allowedMethods())app.listen(3000)//router.jsconstRouter=require('koa-router')constrouter=newRouter()constuser=require('./controller/user')router.post('/user/login',user.login)router.get('/user/profile',user.profile)module.exports=router//控制器/用户.jsconstsleep=async(ms)=>{returnnewPromise(resolve=>{setTimeout(()=>{resolve(true)},ms)})}module.exports={login(ctx){ctx.body={username:ctx.request.body.username}},asyncprofile(ctx){awaitsleep(1000)ctx.body={username:'SexSenior',sex:'man',age:'999'}}}并重新执行nodeindex.js。访问对应的路由,应该可以得到对应的结果。其他工程配置都搞定了。至此,我们的服务器已经大致完成了,但是我们发现了一个非常恼人的问题。每次修改代码都要重新nodeindex.js,太烦人了。我希望的是,每次我更新代码时,它都可以重新执行并为我执行ESlint。其他像webpack这样的前端项目,如果你不是webpack配置工程师,可以搬过去,自己改。这里我介绍一个简单的解决方案,nodemon+gulp。具体我就不一步步来了。这种东西你不需要了解太多,只要你能运行它就可以满足你的需要。如果不需要eslint,安装nodemon即可。package.jsonscripts部分改为:"scripts":{"nodemon":"nodemonindex.js"}然后命令行执行:npminstallnodemon--save-devnpmrunnodemon如果有需要eslint,它会有点麻烦现在,我不会发布eslint的init教程,我会粘贴我的gulp配置文件://gulpfile.jsconstgulp=require('gulp')constlint=require('gulp-eslint')constnodemon=require('gulp-nodemon')functionlintFiles(files){returngulp.src(files).pipe(lint()).pipe(lint.format())//.pipe(lint.failAfterError())}gulp.task('eslint',()=>lintFiles(['**/*.js','!node_modules/**']))gulp.task('eslint_nodemon',['eslint'],()=>{returnnodemon({script:'./app/server.js',//项目入口文件任务(changedFiles){lintFiles(changedFiles)return[]},ignore:['build/**','dist/**','.git','node_modules/**']})})gulp.task('default',['eslint_nodemon'])//package.json脚本"scripts":{"start":"pm2startindex.js--watch",//这里使用pm2作为在线运行,有兴趣的同学可以自己去看看"dev":"gulp","lint":"eslint.","fix":"eslint--fix."},写到这里,我想有些同学应该可以上手了,但这只是koa的初步搭建。如果真的要投入使用,可能需要根据业务需要安装数据库驱动等中间件。对于复杂业务场景下的服务器,需要更合理地设计控制器和服务,这里不再赘述。如果这篇文章能帮到一些同学,下次有时间我会写的。ps:文中介绍的所有代码均已上传至github。需要的同学请自行阅读。地址:https://github.com/wuomzfx/koa2