egg如何创建项目
一、创建
第一种方法:
$ mkdir egg-example && cd egg-example $ npm init egg --type=simplek $ npm i
第二种、方法:
npm i egg-init -g egg-init egg-example --type=simple
--type+骨架类型
simple 简单egg应用程序框架 enpty 空的egg应用程序框架 plugin egg plugin骨架 framework egg framework骨架
二、安装依赖
npm install --save egg-sequelize mysql2 sequelize-auto egg-view-nunjucks egg-view-nunjucks--安装的模板引擎
模板引擎
框架内置 egg-view 作为模板解决方案,并支持多模板渲染,每个模板引擎都以插件的方式引入,但保持渲染的 API 一致。查看如何使用模板,如果想更深入的了解,可以查看模板插件开发。
可使用以下模板引擎:
- egg-view-nunjucks
- egg-view-react
- egg-view-vue
- egg-view-ejs
- egg-view-handlebars
- egg-view-pug
- egg-view-xtpl
三、运行
cd edd-example npm i
四、egg目录
- app - 项目开发的主目录,工作中的代码几乎都写在这里面 -- controller -- 控制器目录,所有的控制器都写在这个里面 -- router.js -- 项目的路由文件 - config - 项目配置目录,比如插件相关的配置 -- config.default.js -- 系统默认配置文件 -- plugin.js -- 插件配置文件 - logs -- 项目启动后的日志文件夹 - node_modules - 项目的运行/开发依赖包,都会放到这个文件夹下面 - test - 项目测试/单元测试时使用的目录 - run - 项目启动后生成的临时文件,用于保证项目正确运行 - typings - TypeScript配置目录,说明项目可以使用TS开发 - .eslintignore - ESLint配置文件 - .eslintrc - ESLint配置文件,语法规则的详细配置文件 - .gitignore - git相关配置文件,比如那些文件归于Git管理,那些不需要 - jsconfig.js - js配置文件,可以对所在目录下的所有JS代码个性化支持 - package.json - 项目管理文件,包含包管理文件和命令管理文件 - README.MD - 项目描述文件
五、dev和start的区别
打开package.json文件的scripts属性中,有下面这样一段代码。
"scripts": { "start": "egg-scripts start --daemon --title=egg-server-egg", "stop": "egg-scripts stop --title=egg-server-egg", "dev": "egg-bin dev", "debug": "egg-bin debug", "test": "npm run lint -- --fix && npm run test-local", "test-local": "egg-bin test", "cov": "egg-bin cov", "lint": "eslint .", "ci": "npm run lint && npm run cov", "autod": "autod" },
其中有 start 和dev,这两个是有区别的,我在上节也简单的一嘴概括了。这里给大家详细的解释一下。
dev : 开发环境中使用,不用重启服务器,只要刷新。修改内容就会更改。 start:生产环境中使用,也就是开发完成,正式运营之后。以服务的方式运行。修改后要停止和重启后才会发生改变。
六、新页面配置路由
在app/controller里面新建一个js,如:home.js
1、新建 /app/controller/home.js
'use strict'; const Controller = require('egg').Controller; class HomeController extends Controller { async index() { const { ctx } = this; ctx.body = 'Hello World'; } async content() { const { ctx } = this; const query = ctx.query; console.log('query', query); ctx.body = '内容信息'; } } module.exports = HomeController;
注意的是Egg.js全部使用异步模式async。
此时页面打开http://127.0.0.1:7001/home/content, 但非常抱歉,这时并不能给你返回正确的结果。因为写完页面以后,还需要去配置路由router.js。
2、在/app/router.js里面配置路由
module.exports = app => { const { router, controller } = app; router.get('/', controller.home.index); router.get('/home/content', controller.home.content); };
这样设置完路由后就能正常访问了
这些配置,开发时只要安装Egg.js的约定去写,这些配置它已经为我们处理好了。这也就是框架的设计理念约定优于配置.
七、Controller控制器的使用
Controller是什么?
动手操作之前,我们需要先学点理论知识。Controller,也就是控制器,简单说Controller负责解析用户的输入,处理后返回相应的结果。但是由于开发形式的不同,Controller的具体作用还是有一些区别的。
在RESTful接口中,Controller接受用户的参数,从数据库中查找内容返回给用户或者将用户的请求更新到数据库中。 在HTML页面请求中,Controller根据用户访问不同的URL,渲染不同的模板得到HTML返回给用户。 在代理服务器中,
Controller将用户的请求转发到其它服务器上,并将其它服务器的处理结果返回给用户。 官方给的建议是Controller层主要对用户的请求参数进行处理(校验、转换),然后调用对应的service方法处理业务,得到业务结果封装并返回。
八、get和post的请求
一、自定义模式传值
地址http://127.0.0.1:7001/test?name=李四&age=80
控制器里取值
/app/controller/test.js
class TestController extends Controller { async index() { // 自由传参模式 const ctx = this.ctx; ctx.body = ctx.query; --{"name":"李四","age":"80"} } } module.exports = TestController;
router.js
module.exports = app => { const { router, controller } = app; router.get('/test', controller.test.index); };
二、严格传参模式
地址 http://127.0.0.1:7001/test/detail/小红/29
/app/controller/test.js
class TestController extends Controller { async detail() {// 严格传参模式 const ctx = this.ctx; ctx.body = 'getGirl:' + ctx.params.name; } }
router.js
module.exports = app => { const { router, controller } = app; router.get('/test/detail/:name/:age', controller.test.detail); --name/age传的参数 };
--- ctx.params.name 获取严格传的name参数 --- ctx.params.age 获取严格传的age参数
** 严格传参模式较安全,可以防止攻击和请求参数泄露