egg框架使用(1)静态资源托管和路由注册以及controller的使用

338 阅读3分钟

egg框架约定规则

  1. app/router.js:用于配置URL路由规则;

  2. app/controller/:用于解析用户输入的URL,并将其处理后返回相应的结果;

  3. app/service/: 用于编写业务逻辑层;

  4. app/public/: 用于放置静态资源,public文件夹下的所有资源文件都有自己的网址,用户输入网址即可访问到资源;

5.config/config.{env}.js: 用于编写配置文件;

6.config/plugin.js:用于配置需要加载的插件;

egg静态资源托管

静态资源托管只需要在搭建好的环境下创建一个public的文件夹,然后把需要托管的静态资源放在public文件夹下即可。

image.png

image.png

路由注册

注册路由时需要注意的是路由名不能跟静态文件资源名相同,不然会优先访问静态资源。遇到同名的路由时,就是先注册的路由就执行先注册路由的函数,一旦匹配上了就会返回数据,只要返回了数据就会断开这一次和客户端的连接。

egg框架中网络请求时,后端处理顺序:

后端优先读取静态文件夹中得资源,有资源能够和解析的URL匹配则返回静态资源的数据包。然后读取不到静态资源就会去注册的路由中匹配,按照注册路由的顺序匹配,在没有注册的路由与其匹配就会匹配星号路由,星号路由就是所有网址都能匹配,所以星号路由需要放在注册路由的最后。

module.exports = app => {
  const { router, controller } = app;
  router.get('/', controller.home.index);
  router.get("/aotu",controller.home.aotu);
  //*星号路由,表示客户端随便输入什么pathname的网址都会执行controller文件夹下的home.js文件中得all函数
  router.get("/*",controller.home.all);
};
const Controller = require('egg').Controller;

class HomeController extends Controller {
  async index() {
    const { ctx } = this;
    ctx.body = 'hi, egg';
  }
  async aotu() {
    this.ctx.body = 'anything is possible';
  }
  async all() {
    this.ctx.body = 'hi,卤蛋';
  }
}

module.exports = HomeController;

image.png

controller的使用

controller文件夹下可以创建任意的js文件用于解析用户输入的URL,并将其处理后返回相应的结果。创建的js文件中必须extends Controller只有继承了框架的Controller类,才能使用框架上的一些功能来封装自己的业务功能,js文件中的类名可以自定义。所有的Controller文件都必须放在app文件夹下的controller目录下以及支持多级目录,访问时可以通过目录名级联访问。

//注册的路由
router.get('/hello', controller.user.home.news)
//控制器对应:
//controller文件夹下有一个user文件夹下有一个home.js文件中有一个news方法
this.ctx.body = 'hi,卤蛋';

1.this.ctx是Controller类提供的功能,主要用于给客户端发送数据,访问插件功能

2.当项目下载了某个插件就不要在引入,可以在config文件夹下的plugin.js文件中配置,然后直接使用this.ctx就可以访问插件功能了

3.body指数据包中的响应体,也就是数据包中的数据,this.ctx.body相当于end函数,执行完毕后后面的不在执行。

4.this.ctx.body只会执行一次后端就断开与客户端的网络连接