Egg是一个标准的MVC框架,其中service就代表model层,专门用于和数据打交道,本篇将讲解如何在egg中定义service并在controller中调用,以及service的一些相关规则。
1. 使用方法
首先在service文件夹下定义服务文件news.js,并在文件中添加方法getNewsList。
代码语言:javascript复制'use strict';
const Service = require('egg').Service;
class NewsService extends Service {
async getNewsList() {
// 获取新闻数据,此处为模拟数据,实际项目应从数据库获取数据
var list = ['新闻一', '新闻二', '新闻三'];
return list;
}
}
module.exports = NewsService;
然后在控制器中就可以使用定义的服务了。
代码语言:javascript复制'use strict';
const Controller = require('egg').Controller;
class NewsController extends Controller {
async index() {
var msg = '今日要闻';
// 通过调用服务从数据库获取数据
// service对应文件夹,news对应文件,getNewsList对应方法
var list = await this.service.news.getNewsList();
// 渲染news模板引擎,传入msg与list数据
await this.ctx.render('news', {
msg: msg,
list: list
});
}
}
module.exports = NewsController;
2. 服务的调用规则及可调用方法
服务既可以被控制器调用也可以被服务调用,控制器既不可以被控制器调用也不可以被服务调用。
服务继承于Service,为了方便 ,egg 在 this上面绑定了以下方法,可以在服务中调用。
1. this.ctx:当前请求的上下文 Context 对象的实例,通过它我们可以拿到框架封装好的处理当前请求的各种便捷属性和方法。
2. this.app:当前应用 Application 对象的实例,通过它我们可以拿到框架提供的全局对象和方法。
3. this.service:应用定义的 Service,通过它我们可以访问到其他业务层,等价于 this.ctx.service。
4. this.config:应用运行时的配置项。
5. this.logger:logger 对象,上面有四个方法(debug,info,warn,error),分别代表打印四个不同级别的日志,通过这个 logger 对象记录的日志,在日志前面会加上打印该日志的文件路径,以便快速定位日志打印位置。
下面是调用实例:
代码语言:javascript复制'use strict';
const Service = require('egg').Service;
class NewsService extends Service {
async getNewsList() {
// 获取新闻数据,此处为模拟数据,实际项目应从数据库获取数据
var list = ['新闻一', '新闻二', '新闻三'];
// 获取config配置数据
var api = this.config.api;
// 获取其它服务的数据
var user = await this.service.user.getUserInfo();
var obj = {
api: api,
list: list,
user: user
}
return obj;
}
}
module.exports = NewsService;
3.服务的命名
Service 文件必须放在 app/service 目录,可以支持多级目录,访问的时候可以通过目录名级联访问。
由于文件命名的方式不同,调用服务时需要遵循以下规则:
1. 小写与小驼峰直接调用,推荐使用。
app/service/biz/user.js => ctx.service.biz.user
2. 下划线转小驼峰。
app/service/sync_user.js => ctx.service.syncUser
3.大驼峰转小驼峰。
app/service/SyncUser.js => ctx.service.syncUser