egg框架约定规则
-
app/router.js:用于配置URL路由规则;
-
app/controller/:用于解析用户输入的URL,并将其处理后返回相应的结果;
-
app/service/: 用于编写业务逻辑层;
-
app/public/: 用于放置静态资源,public文件夹下的所有资源文件都有自己的网址,用户输入网址即可访问到资源;
5.config/config.{env}.js: 用于编写配置文件;
6.config/plugin.js:用于配置需要加载的插件;
egg静态资源托管
静态资源托管只需要在搭建好的环境下创建一个public的文件夹,然后把需要托管的静态资源放在public文件夹下即可。
路由注册
注册路由时需要注意的是路由名不能跟静态文件资源名相同,不然会优先访问静态资源。遇到同名的路由时,就是先注册的路由就执行先注册路由的函数,一旦匹配上了就会返回数据,只要返回了数据就会断开这一次和客户端的连接。
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;
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只会执行一次后端就断开与客户端的网络连接