Egg.js基础入门二:Service服务与插件

续接上篇~~~

接收参数

我们大多会把对于数据库的操作放到service服务中,然而对于数据库的操作的一些条件都是需要通过参数来确定的,所以在开始引入Service之前先说一下接收参数吧

在Egg中接收参数的方式与Koa是基本一致的,看一眼就能懂啦

Get请求参数

Gue请求我们可以通过query传参数也可以通过path来传递参数

先说一下query传递参数:

假设有路由如下

1
2
// /app/router.js
router.get('/getQuery', controller.demo.getQuery)
1
2
3
4
5
6
7
8
9
// /app/controller/demo.js

async getQuery(){
const { ctx } = this
// 与koa一致,通过ctx.query拿到参数
// 假设访问的是getQuery?name=a&age=18,那ctx.query就是{name:a,age:18}
const query = ctx.query
ctx.body = query
}

用path传参数需要在路由上进行定义

1
2
// /app/router.js
router.get('/getPath/:name/:age', controller.demo.getPath)
1
2
3
4
5
6
// /app/controller/demo.js
async getPath(){
const { ctx } = this
// 通过ctx.params 拿到参数
ctx.body = ctx.params
}
Post请求参数

post请求通过ctx.request.body接收参数,与koa一致

1
2
3
4
5
// /app/controller/demo.js
async postMethod(){
const { ctx } = this
ctx.body = ctx.request.body
}

Service服务

Service是用于在复杂场景下用于对复杂业务逻辑封装的一个抽象层,所有和数据库交互的代码可以放到这里,这样做有几个好处:

  • 保持Controller逻辑更加简单
  • 保持业务逻辑的独立性,Service可以被多个Controller调用
  • 将数据逻辑和展现逻辑分离,测试用例写起来更加简单

Egg要求我们所有的Service必须放到/app/service目录下,如果没有该目录可以自行创建

Service的代码实现与Controller很相似

在controller中可以通过上下文来使用service,使用方法为ctx.service.文件名.方法名

假设我们有一个service如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// /app/service/demo.js
'use strict'
// 引入 service
const Service = require('egg').Service
class DemoService extends Service{
// 异步方法哦
async demo(id){
// 在这里进行数据库操作
// 返回内容
return {
name: 'asssd',
age: 18
}
}
}
// 导出
module.exports = DemoService

接下来就可以在controller中使用Service服务来

1
2
3
4
5
6
7
8
9
10
// /app/controller/demo.js
async useService(){
const { ctx } = this
// 获取查询条件
const id = ctx.query.id
// 调用service得到查询结果, 记住要用await, ctx.service.文件名.方法名
const res = await ctx.service.demo.demo(id)
ctx.body = res

}

插件

Egg提供了很多插件,我们可以去安装使用,也可以自己编写插件,插件的配置都大同小异,具体的用法要查看插件的文档了,我们拿ejs引擎来介绍一下配置方法

安装

egg提供的插件都是以egg-开头的,可以通过yarn或者npm进行安装

1
yarn add egg-view-ejs
配置

Egg的项目中有两个配置文件,一个是plugin.js,一个是config.default.js

毫无疑问plugin.js就是用来声明插件的,而config.default.js可以做很多中配置,不仅限于插件。

1
2
3
4
5
6
7
8
9
// /config/plugin.js
'use strict'

exports.ejs = {
// 启用插件
enable: true,
// 制定包名
package: 'egg-view-ejg'
}

这样我们就声明了ejs插件,几乎所有插件都要在这里用这种形式去声明

我们还可以在config.default.js中对其做一些额外的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// /config/config.default.js
'use strict'

module.exports = appInfo => {
const config = exports = {}
config.view = {
// 配置所有的html都使用ejs引擎来解析
mapping: {
'.html': 'ejs'
}
}
// 对于ejs引擎的个性化配置
config.ejs = {
// 将ejs引擎解析的%替换成$
delimiter: "$"
}
}

关于插件具体有哪些可配置项,就需要查看插件的文档了,在此不过多赘述。

作者

胡兆磊

发布于

2022-04-01

更新于

2022-10-23

许可协议