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

阿里egg.js初体验(一)

时间:2023-04-03 20:53:34 Node.js

egg.js是阿里推出的基于koa的节点开发框架。今天抽空体验了一下,按照官方教程做了一个HackerNews。其实官方提供了脚手架,只是这次我们不用。在开始之前,我们先看一下KOA的中间件的洋葱模型。理解这一点,对于我们后面理解一个请求的执行路径会有很大的帮助。好了,开始我们的彩蛋之旅吧!1、首先初始化项目结构:$mkdiregg-example$cdegg-example$npminit$npmiegg--save$npmiegg-bin--save-dev2,在package.json中添加如下命令:"scripts":{"dev":"egg-bindev"}3.开始写代码。在此之前,我们应该对项目的目录结构有一个约定。官方说明在这里https://eggjs.org/zh-cn/basic...等我们回来再说这个目录。4我们需要一个controller,一个router,一个config,如下='你好世界';}}module.exports=HomeController;//app/router.jsmodule.exports=app=>{const{router,controller}=app;router.get('/',controller.home.index);};//config/config.default.jsexports.keys=<在此处更改您自己的cookie安全字符串>;此时目录结构如下:egg-example├──app│├──controller││└──home.js│└──router.js├──config│└──config.default。js└──package.json好了,现在检查一下,运行npmrundev,在http://127.0.0.1:7001/检查,一切正常。这里有几个地方需要注意。Controller有两种写法,class和exports。那么这两种写法有什么区别呢?以类的形式编写Controller,不仅可以让我们更好的抽象出Controller层的代码(比如将一些统一的处理抽象成一些私有方法),还可以通过自定义Controller基类来封装应用中常用的方法。至于method方法,官方不推荐,只是为了兼容。其中,每个Controller都是一个asyncfunction,它的入参是请求上下文Context对象的一个??实例。一个方便的属性和方法config也有module.exports和exports两种写法,那么这两种写法有什么区别呢?module.exports是Module系统创建对象的语法,但是如果你希望你的模块是一个类的实例,你可以将实例赋值给module.exports。比如module.exports此时指向了A的一个实例。你可以用下面的方式调用A的方法module.exports.xxx(),相当于a.xxx()。但如果它只是exports=newClassA();这只是重新绑定模块变量导出。注意绑定到module.exports不能是异步绑定或者回调!可以这样理解,其他模块使用这个模块时,使用的是module.exports指向的,exports是模块的内部变量,外部模块无法访问。module.exports和exports是两个变量,但起初它们指向同一个对象。可以使用exports作为模块内部module.exports的快捷方式现在我们来看官方的目录结构规范:egg-project├──package.json├──app.js(optional)├──agent.js(可选)├──应用程序|├──router.js│├──控制器│|└──home.js│├──服务(可选)│|└──user.js│├──中间件(可选)│|└──response_time.js│├──时间表(可选)│|└──my_task.js│├──public(可选)│|└──reset.css│├──视图(可选)│|└──home.tpl│└──extend(可选)│├──helper.js(可选)│├──request.js(可选)│├──response.js(可选)│├──上下文。js(可选)│├──application.js(可选)│└──agent.js(可选)├──config|├──plugin.js|├──config.default.js│├──config.prod.js|├──config.test.js(可选)|├──config.local.js(可选)|└──配置单元测试。js(可选)└──测试├──中间件|└──response_time.test.js└──controller└──home.test.js同上,框架约定的目录:app/router.js进行配置,URL路由规则详见Router。app/controller/**用于解析用户输入,处理后返回相应的结果,详见Controller。app/service/**用于编写业务逻辑层,可选,推荐,详见Service。app/middleware/**用于编写中间件,可选,详见Middleware。app/public/**用于放置静态资源,可选,详见内置插件egg-static。app/extend/**用于框架扩展,可选,详见框架扩展。config/config.{env}.js用于编写配置文件,详见配置。config/plugin.js用于配置需要加载的插件,详见Plugins。test/**用于单元测试,详见单元测试。app.js和agent.js用于自定义启动时的初始化工作,可选,详见启动自定义。agent.js的作用参见Agent机制。内置插件约定的目录:app/public/**用于放置静态资源,可选,详见内置插件egg-static。app/schedule/**用于定时任务,可选,详见定时任务。如果需要自定义自己的目录规范,参见LoaderAPIapp/view/**用于放置模板文件,可选,由模板插件约定,详见模板渲染。app/model/**用于放置领域模型,可选,领域相关插件约定,如egg-sequelize。(待续)