07.Egg.js教程-Service服务的编写

本文主要学习一下Egg中的Service。Service用来编写和数据库直接交互的业务逻辑代码。

官方对Service服务的说明

Service就是在复杂业务场景下用于做业务逻辑封装的一个抽象层。

简单来说,就是把业务逻辑代码进一步细化和分类,所以和数据库交互的代码都放到Service中。这样作有三个明显的好处。

  • 保持Controller中的逻辑更加简介。
  • 保持业务逻辑的独立性,抽象出来的Service可以被多个Controller调用。
  • 将逻辑和展现分离,更容易编写测试用例。

个人建议只要是和数据库的交互操作,都写在Service里,用了Egg框架,就要遵守它的约定。

创建编写第一个Service文件

Egg规定Service文件必须放在/app/service目录,所以我们在/app文件夹下面,新建一个service文件夹。然后在新建一个mybj.js文件。

'use strict';

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

class MybjService extends Service{
    async getGirl(id) {
        //因为没有真实连接数据库,所以模拟数据
        return {
            id:id,
            name:'小红',
            age:18
        }
    }
}

module.exports = MybjService;

从代码中可以看出,命名规则和写法跟Controller是非常类似的。如果你能对比记忆,学习会简单很多。同样Service里的方法也全部是异步方法,所以要使用async关键字。

Controller调用Service获取数据

写完Service方法后,就可以在Controller中使用Service获取它提供的数据了。现在我们回到/app/controller/mybj.js文件中的getGirl()方法。

编写代码前,我们并不需要把service进行引入,因为Egg已经为我们作好了这一切。直接使用ctx上下文就可以进行使用了。

下面为Controller中的getGirl()方法改写。

async getGirl(){
    const {ctx} = this;
    const res = await ctx.service.mybj.getGirl('1818');
    ctx.body = res
}

写完后,用npm run dev命令,启动服务。然后打开浏览器,输入http://127.0.0.1:7001/getGirl 就可以看到页面会呈现出service给我们返回的数据。

Controller调用Service获取数据

Service方法的可调用性

当你写完一个service方法后,你可以在其它的Controller里进行使用。比如我们现在去home.js中进行使用。打开/app/controller/home.js文件下,新建一个testGetGirl()方法。

async testGetGirl(){
    const ctx = this.ctx;
    const id = ctx.query.id;
    const res = await ctx.service.mybj.getGirl(id);
    ctx.body=res;
}

写完上面的代码,到/app/router.js文件里,增加一个新的路由。

router.get('/testGetGirl', controller.home.testGetGirl);

写完后保存文件,然后在浏览器中输入URL[http://127.0.0.1:7001/testGetGirl?id=2021]。可以看到,页面如愿以偿的获得了这些数据。

Service方法的可调用性

总结

本文主要学习了Egg.js的Service的使用,Service应该放在/app/servcie文件夹下面,命名的时候最好和Controller对应起来。写法和Controller类似,并且在任何Controller下都可以得到Service提供的数据。

「点点赞赏,手留余香」

0

给作者打赏,鼓励TA抓紧创作!

微信微信 支付宝支付宝

还没有人赞赏,快来当第一个赞赏的人吧!

声明:
1. 本站所有文章教程及资源素材均来源于网络与用户分享或为本站原创,仅限用于学习和研究。
2. 如果内容损害你的权益请联系客服QQ:1642748312给予处理。
码云笔记 » 07.Egg.js教程-Service服务的编写

发表回复

IT互联网行业相关广告投放 更专业 更精准

立即查看 联系我们