egg.js

vscode配置egg.js

关于egg.js的小贴士:

  • app/public文件夹用于放静态资源
  • app/service 文件夹用于放数据处理(M)
  • app/view 文件夹用于放模板 (V)
  • app/controller文件夹用于放业务逻辑处理(C)
  • app/middleware 文件夹用于放中间件
  • app/extend 文件夹用于存放扩展插件
  • koa给用户了一个context对象,egg把它又封装近了this (其实是个Controller)中
  • 一个服务可以被多个控制器调用
  • 一个服务可以调用另一个 服务
egg.js框架

一. 安装egg

首先nodejs大于8.0

cnpm i egg-init -g

https://eggjs.org/

二. 快速初始化

1. 脚手架初始化egg工程

我们推荐直接使用脚手架,只需几条简单指令,即可快速生成项目(npm >=6.1.0):
(非常可能需要翻墙~~cnpm都不好使)

$ mkdir egg-example && cd egg-example
$ npm init egg --type=simple

安装过程中可能会有一些询问, 按需填写

2. 恢复依赖

$ cnpm i

3. 启动项目:

$ npm run dev
$ open http://localhost:7001

4. 工程目录结构


app文件夹必须有这个结构

三. 路由

1. 最简单的路由

太简单了,只需要两步

1. 在app/controller/home.js中添加一个
  async news() {
    const { ctx } = this;  //koa给用户了一个context对象,egg把它又封装近了this中 (其实是个Controller)
    ctx.body = 'hi, news';
  }
2. 在app/router.js中添加get方法
router.get('/news', controller.home.news);

2. 获取get传值 this.ctx.query

this.ctx.query

3. 动态路由 this.ctx.params

在router.js中设置一个动态路由
router.get('/newslist/:id',controller.news.newslist)

访问时需要传入动态路由值http://127.0.0.1:7001/newslist/123

如何获取动态路由参数?
    async newslist() {
        this.ctx.body = this.ctx.params
    }

四. 模板引擎 ejs

cnpm i egg-view-ejs --save

1. 配置ejs

// {app_root}/config/plugin.js
'use strict';
exports.ejs = {
  enable: true,
  package: 'egg-view-ejs',
};

// {app_root}/config/config.default.js
config.view = {
    mapping: {
      '.html': 'ejs',
    }
  }

2. 使用

// app/view/hello.html
hello <%= data %>
Render it

// app/controller/render.js
exports.ejs = async ctx => {
  await ctx.render('hello', {
    data: 'world',
  });
}; 

//news.js
class NewsController extends Controller {
    async index() {
        await this.ctx.render('hello',{
            data:1
        })
    }
}

ejs语法请参考https://www.jianshu.com/p/1a7e01d41801
ejs

五 静态资源

egg.js中的静态资源不需要声明,直接访问
http://127.0.0.1:7001/public/1.jpg

六 配置公共参数

在config.default.js中

例如;我们配置了
config.api="http://www.phonegap100.com"

那么在任何地方,我们都可以用this.config.api 来调用得到这个字符串

七. 控制器Controller

1. 控制器的this

定义的 Controller 类,会在每一个请求访问到 server 时实例化一个全新的对象,而项目中的 Controller 类继承于 egg.Controller,会有下面几个属性挂在 this 上。

  • this.ctx: 当前请求的上下文 Context 对象的实例,通过它我们可以拿到框架封装好的处理当前请求的各种便捷属性和方法。
  • this.app: 当前应用 Application 对象的实例,通过它我们可以拿到框架提供的全局对象和方法。
  • this.service:应用定义的 Service,通过它我们可以访问到抽象出的业务层,等价于 this.ctx.service
  • this.config:应用运行时的配置项
  • this.logger:logger 对象,上面有四个方法(debuginfowarnerror),分别代表打印四个不同级别的日志,使用方法和效果与 context logger 中介绍的一样,但是通过这个 logger 对象记录的日志,在日志前面会加上打印该日志的文件路径,以便快速定位日志打印位置。

2.

八. 服务Service

1. 服务的this

每一次用户请求,框架都会实例化对应的 Service 实例,由于它继承于 egg.Service,故拥有下列属性方便我们进行开发:

  • this.ctx: 当前请求的上下文 Context 对象的实例,通过它我们可以拿到框架封装好的处理当前请求的各种便捷属性和方法。
  • this.app: 当前应用 Application 对象的实例,通过它我们可以拿到框架提供的全局对象和方法。
  • this.service:应用定义的 Service,通过它我们可以访问到其他业务层,等价于 this.ctx.service
  • this.config:应用运行时的配置项
  • this.logger:logger 对象,上面有四个方法(debuginfowarnerror),分别代表打印四个不同级别的日志,使用方法和效果与 context logger 中介绍的一样,但是通过这个 logger 对象记录的日志,在日志前面会加上打印该日志的文件路径,以便快速定位日志打印位置。

2.服务的命名规则

Service 文件必须放在 app/service 目录,可以支持多级目录,访问的时候可以通过目录名级联访问。

app/service/biz/user.js => ctx.service.biz.user
app/service/sync_user.js => ctx.service.syncUser
app/service/HackerNews.js => ctx.service.hackerNews

3. 服务的创建和访问

我们在service下建立一个news.js来提供数据服务

'use strict';

const Service = require('egg').Service;

class NewsService extends Service {
  async getlist() {
    //获取新闻数据
    return [111,222,333,888]
  }
}

module.exports = NewsService;

在控制器中,我们可以使用这个服务this.service.news.具体服务

'use strict';

const Controller = require('egg').Controller;

class NewsController extends Controller {
    async index() {
        let list1=await this.service.news.getlist()
        await this.ctx.render('news',{
            data:1,
            list1
        })
    }
}

module.exports = NewsController;

八. 用this.ctx.curl(url)请求数据

九. 扩展 extend

框架提供了多种扩展点扩展自身的功能:

  • Application
  • Context
  • Request
  • Response
  • Helper 工具方法
    在开发中,我们既可以使用已有的扩展 API 来方便开发,也可以对以上对象进行自定义扩展,进一步加强框架的功能。
    如果想扩展哪个东西,就要在app/extend文件夹中新建xxx.js 比如:app/extend/context.js
    比如:我们新建一个方法让时间戳转化为时间
    新建app/extend/application.js, 框架会把 app/extend/application.js 中定义的对象与 Koa Application 的 prototype 对象进行合并,在应用启动时会基于扩展后的 prototype 生成 app 对象。

方法扩展

例如,我们要增加一个 app.foo() 方法:

module.exports = {
 foo(param) {
 // this 就是 app 对象,在其中可以调用 app 上的其他方法,或访问属性
 },
};

属性扩展

一般来说属性的计算只需要进行一次,那么一定要实现缓存,否则在多次访问属性时会计算多次,这样会降低应用性能。

推荐的方式是使用 Symbol + Getter 的模式。

例如,增加一个 app.bar 属性 Getter:

// app/extend/application.js
const BAR = Symbol('Application#bar');

module.exports = {
  get bar() {
    // this 就是 app 对象,在其中可以调用 app 上的其他方法,或访问属性
    if (!this[BAR]) {
      // 实际情况肯定更复杂
      this[BAR] = this.config.xx + this.config.yy;
    }
    return this[BAR];
  },
};
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容

  • by yugasun from https://yugasun.com/post/serverless-admin...
    yugasun阅读 2,649评论 3 18
  • Egg.js是阿里开源的基于Koa的一个企业级Node框架,具体介绍在这里不做详细说明,想要了解更多可以查看Egg...
    白酒__阅读 9,059评论 0 3
  • ##### 什么是Socket.io 一个基于 Node.js 的实时应用程序框架,在即时通讯、通知与消息推送,实...
    c4e78fd2e90b阅读 564评论 1 3
  • ##### 什么是Socket.io 一个基于 Node.js 的实时应用程序框架,在即时通讯、通知与消息推送,实...
    49a054febed1阅读 5,115评论 5 2
  • 官方教程有点跳跃,很多东西没讲清楚,不太适合小白理解,特此整理、归纳一下。打开这篇博客的正确方式是:先读一遍官方教...
    写Blog不取名阅读 62,939评论 1 35