egg重写博客接口
发布于 5 个月前 作者 k-water 1509 次浏览 来自 分享

之前用React全家桶和Java的SpringBoot重构了自己的个人博客,虽然做出来了,但是还是初成版,自我感觉还是存在很多问题。由于对Java不是完全熟悉,所以写出来的接口可能有些瑕疵,所以最近学习了eggjs,使用了egg重写了后台接口。

项目

项目地址https://github.com/k-water/egg-blog(喜欢的请点个star^_^)

运行

#1
git clone https://github.com/k-water/egg-blog.git

#2 
cd egg-blog
npm install

#3
修改config.default.js中sequelize的配置
mysql的账号密码改为自己的

#4
npm run dev

流程

参考文档

Egg官方文档

Sequelize(英文)

Sequelize(中文)

技术选型

后台框架:Egg 数据库:Mysql 插件:egg-sequelize

接口测试

工具:PostMan

数据库设计

数据库设计跟之前的也略有不同,差别的是各实体之间的联系。 实体有

  • blogs
  • comments
  • users
  • catalogs
  • authorities(用户角色)

ER图如下

实体之间联系

开发的接口

个人总结

基于学习的态度,重写了博客的后台接口,总的来说,egg使用起来还是挺方便的,官方文档写的也很好,基本遇到问题都能在官方issue找到类似的回答,写起来有点像Java的感觉。 这次让我学习到的是,基础要扎实,像数据库的设计这方面,如果学不好,那一开始也无法下手,写出来的接口肯定也是不够好,因为要考虑返回数据格式的问题,什么接口返回什么格式等等。所以基础还是很重要的,之前学的时候一直认为没什么用,反正我又用不到,但是在实践中才发现,这些技能都是需要具备的,干起活来才能事半功倍。另外一点就是要仔细阅读文档,不要急于下手写代码,对一个框架有了初步的掌握,才去下手,那样遇到问题也能快速定位到错误的位置。 以上,就是个人的小小体会啦~

接口文档

API接口文档

16 回复

赞,接口测试为啥不直接用单元测试?

@atian25 单元测试这方面还比较弱,正在学习中

@k-water 看下文档,这块非常的简单

@atian25 好的 看完实践一下

文档地址:https://eggjs.org/zh-cn/core/unittest.html

举个例子:

有业务代码:

// app/router.js
module.exports = app => {
  const { router, controller } = app;
  router.get('homepage', '/', controller.home.index);
};

// app/controller/home.js
class HomeController extends Controller {
  async index() {
    this.ctx.body = 'hi, egg';
  }
}

对应的测试代码:

// test/controller/home.test.js
const { app, mock, assert } = require('egg-mock/bootstrap');

describe('test/controller/home.test.js', () => {
  it('should work', () => {
    // 对 app 发起 `GET /` 请求
    return app.httpRequest()
      .get('/')
      .expect(200) // 期望返回 status 200
      .expect(/hi/); // 期望 body 包含 hi
  });
});

执行测试:

$ npm test

  test/app/controller/home.test.js
    ✓ should work
	
  1 passing (100ms)

就这么简单

@atian25 哈哈 done!请教一下像这样的返回的数据比较复杂的,如何测试才能更准确呢

@k-water

describe('test/controller/home.test.js', () => {
  it('should work', async () => {
    const { status, res } = await app.httpRequest().get('/');

    // 这里我忘记有没有 json 了,如果没有就自己 parse res.text
	// 到了这步你就可以任意了,找一些 assert 的库,甚至用 JSON Scheme 判断都行
	// 我个人是推荐直接用 assert,会自动替换为 power-assert , 看我们文档里面描述的 power-assert 的强大
    assert(res.body.xx === 'xxx');
  });
});

@atian25 明白,学习了,谢谢大佬的指点。补充一下

// 这里我忘记有没有 json 了,如果没有就自己 parse res.text (这里没有json)

@k-water 那要看下 supertest 的源码了,它们是有个 expect(json) 的方式的,可能是在 expect 里面 parser 了,而不是在 res 里面。

研究了下,其实已经是 parse 好的,这样就行了:

  it('should GET /', async () => {
    const result = await app.httpRequest().get('/');
    assert(result.status === 200);
    assert.deepEqual(result.body, { name: 'egg' });
  });

@atian25 嗯嗯 确实可以 感谢

@x-cold 用我那方式更优雅一点,我喜欢跟 asset 一样

回到顶部