egg.js学习记录

577 阅读3分钟

一、目录结构

  • app文件夹: 项目开发文件,开发时主要编辑的文件;
  • config文件夹: 整个项目的配置目录,项目和服务端的配置都在这里设置;
  • logs文件夹:日志文件夹,正常情况下不用修改和查看里边内容。
  • node_modules:项目所需要的模块文件,这个前端应该都非常了解,不多作介绍。
  • run文件夹:运行项目时,生成的配置文件,基本不修改里边的文件。
  • test文件夹:测试使用的配合文件,这个在测试时会使用。
  • .autod.conf.js: egg.js自己生成的配置文件,不需要进行修改。
  • eslinttrc和eslintignore:代码格式化的配置文件。
  • gitgnore:git设置忽略管理的配置文件。
  • package.json: 包管理和命令配置文件,这个文件经常进行配置。

1. app目录结构:

  • controller文件夹
  • public文件夹
  • router

1.1 controller文件夹

  1. 作用: 控制器,解析用户的输入,处理后返回相应的结果。
  2. 编写controller:所有controller文件都必须放在app/controller目录下,访问时可以通过目录名级联访问。
//app/controller/post.js

const Contrller = require('egg').Controller;
class PostController extends Controller {
  async create() {
    const { ctx, service } = this;
    const createRule = {
      title: {type: 'string'},
      content: {type: 'string'},
    };
    // 教验参数
    ctx.validate(createRule);
    // 组装参数
    const author = ctx.session.userId;
    const req = Object.assign(ctx.request.body, {author});
    // 调用Service进行业务处理
    const res = await service.post.create(req);
    // 设置响应内容和响应状态码
    ctx.body = {id: res.id};
    ctx.status = 200;
  }
}
mudule.exports = PostController;

我们通过上面的代码定义了一个PostController类,类里的每一个方法都可以作为ControllerRouter中被引用到。
3. 属性(挂载在this上): 定义的Controller类,会在每一个请求被访问到server时实例化一个新的对象,而项目中的Controller类继承于egg.Controller:

  • this.ctx: 当前请求的上下文Context对象的实例,通过它我们可以拿到框架封装好的处理当前请求的各种便捷属性和方法
  • this.app: 当前应用Application对象的实例,通过它我们可以拿到框架提供的全局对象和方法
  • this.service:应用定义的Service(1.复杂数据处理;2.引用第三方),通过它我们可以访问到抽象出的业务层(1.保持Controller逻辑简洁;2.业务层独立;3.逻辑和展示分离),等价于this.ctx.service
  • this.config: 应用运行时的配置项。(具名配置项会覆盖默认配置文件的同名配置,即prod环境会加载config.prod.js和config.default.js,config.prod.js会合并且覆盖config.default.js的同名配置)
  • this.logger:logger对象,有四种方法:debug、info、warn、error。 logger对象记录的日志,在日志前面会加上打印该日志的文件路径。

1.2 router(配置路由映射)

//app/router.js
module.exports = app => {
  const { router, controller } = app;
  router.post('createPost', './api/posts', controller.post.create)
}

1.3 配置文件(config)

//config/config.default.js
// 方法一:
exports.key = <此处为自定义的Cookie安全字符串>
exports.logger = {
  level: 'DEBUG',
};
//方法二:
module.exports = {
  logger: {
    dir: '/home/admin/logs/demoapp',
  },
};

二、 RestFul API 接口设计(直观&约束性)

  • URL: 互联网资源的唯一标示;
  • Method: 对互联网资源进行什么操作;

1. 约束的请求方式和对应的操作。

  • POST(CREATE) :在服务器新建一个资源。
  • GET(READ) : 从服务端取出资源,可以同时取出一项或者多项。
  • PUT(UPDATE) :在服务器更新资源(客户端提供改变后的完整资源)。
  • DELETE(DELETE) :从服务器删除资源。

零:问题记录

  1. egg使用npm dev启动失败: 开发环境运行项目即npm run dev的时候是正常的,但是npm start会启动失败,最可能的原因是因为npm start启动使用egg-scripts机制启动,对于运行中遇到error日志就会中断进程,方便发现问题,有时构建过程中的node warnning会认为是stderr被捕获到,所以npm start会构建中断,解决方案是忽略掉stderr中断机制,在原来命令基础上添加--ignore-stderr即可。

截屏2021-04-14 下午5.50.41.png

"scripts": {
    "start": "egg-scripts start --daemon --title=egg-server-chatroomServer --ignore-stderr",
    ...
  },