egg后端服务创建即使用(一)

1,117 阅读4分钟

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参数

** 严格传参模式较安全,可以防止攻击和请求参数泄露