3分钟了解 egg.js

news2025/7/13 12:22:51

Eggjs是什么?

Eggjs是一个基于Koajs的框架,所以它应当属于框架之上的框架,它继承了Koajs的高性能优点,同时又加入了一些约束与开发规范,来规避Koajs框架本身的开发自由度太高的问题。

Koajs是一个nodejs中比较基层的框架,它本身没有太多约束与规范,自由度非常高,每一个开发者实现自己的服务的时候,都有自己的“骚操作”。而egg为了适应企业开发,加了一些开发时的规范与约束,从而解决Koajs这种自由度过高而导致不适合企业内使用的缺点,Egg便在这种背景下诞生。

Egg是由阿里巴巴团队开源出来的一个“蛋”,为什么是个蛋?蛋是有无限可能的,鸡孵出的蛋生小鸡,恐龙孵出来的蛋就是恐龙,这也正更好的体现了egg最大的一个亮点“插件机制”,每个公司每个团队甚至单个开发者都可以在这之上孵化出最适合自己的框架。像阿里内部不同的部门之间都孵化出了合适自己的egg框架,如蚂蚁的chair,UC的Nut,阿里云的aliyun-egg等。

现有的Nodejs框架与Eggjs对比

Express和Egg的对比

Express和Koa两个框架是同一班人发布的,首先Koa肯定先天就有express不能替代的优势,那也代表着以Koa为基础的egg本身比express也是有优势的。在Express这个框架在使用的时候,由于框架的自由度很高,每个开发者都化身为哈姆雷特。比如实现某一个功能的时候,第一个使用者喜欢把controller和service区分开,另一个使用者却就喜欢写在一起,这样的结果就是同是express的项目,换一个人来维护时,成本变得很高,因为你不知道前面开发者的骚操作到底能骚到什么地步。而egg为了企业中使用相同的规范去开发,本身奉行“约定大于配置”的原则,就如上面这个例子,它本身就约定了这个功能该有怎样的规范去实现,从而使得它能在企业框架域中站住脚,发挥Koajs的价值。

Sails和Egg的对比

Sails框架也是一个nodejs为基础的企业级框架,笔者在之前一份工作中,后端正是使用这个框架,正好也对比一下这两个框架。sails的思想是ruby语言的框架rails借鉴来的,它是以express为基础的一个MVC框架,本身也是奉行“约定大于配置”的原则来面向开发者,但是它本身并不属于精巧的那种,框架自身内置了一些常用的功能,例如它的 blueprints,自动生成restApi路由的功能,但是其实我们在正式开发的时候因为这个功能的不能满足我们的要求,实际是不开启这个功能的。它本身还集成了前端模块进去,但是我们只将其作为后端服务来用,也从来没有使用过这些功能。而egg则非常的小巧,所有的模块功能均以插件的模式由开发者选择是否需要被安装使用,完全可以按照自己的需求去觉得框架那些需要安装,做的定制开发。

eggjs项目规范介绍

安装egg

npm init egg --type=simple
npm i  // 安装依赖

框架约定的目录介绍

image.png

  • app/router.js 用于配置 URL 路由规则,具体参见 Router。
  • app/controller/** 用于解析用户的输入,处理后返回相应的结果,具体参见 Controller。
  • app/service/** 用于编写业务逻辑层,可选,建议使用,具体参见 Service。
  • app/middleware/** 用于编写中间件,可选,具体参见 Middleware。
  • app/public/** 用于放置静态资源,可选,具体参见内置插件 egg-static。
  • app/extend/** 用于框架的扩展,可选,具体参见框架扩展。
  • config/config.{env}.js 用于编写配置文件,具体参见配置。
  • config/plugin.js 用于配置需要加载的插件,具体参见插件。
  • test/** 用于单元测试,具体参见单元测试。
  • app.js 和 agent.js 用于自定义启动时的初始化工作,可选,具体参见启动自定义。关于agent.js的作用参见Agent机制。

一个基础的 API 大致由路由、获取请求参数、逻辑处理、返回响应数据几部分组成

路由

app/router.js 用于配置 URL 路由规则

router.get("/", controller.home.index);
// 当访问GET '/' ,app/controller/home.js 下的 index 方法会执行
router.post("/create", controller.user.create);
// 当访问POST '/create' ,app/controller/user.js 下的 create 方法会执行

获取请求参数

this.ctx.query获取 URL 中 ? 后面的部分参数

// GET /posts?category=egg&language=node
// app/controller/post.js
class PostController extends Controller {
  async listPosts() {
    const query = this.ctx.query;
    // {
    //   category: 'egg',
    //   language: 'node',
    // }
  }
}

this.ctx.params获取路由中的动态参数

// app.get('/projects/:projectId/app/:appId', controller.app.listApp);
// GET /projects/1/app/2
class AppController extends Controller {
  async listApp() {
    const params = this.ctx.params;
    // {
    //   projectId: '1',
    //   appId: '2'
    // }
  }
}

this.ctx.request.body获取 body 参数

// POST /api/posts HTTP/1.1
// Host: localhost:3000
// Content-Type: application/json; charset=UTF-8
//
// {"title": "controller", "content": "what is controller"}
class PostController extends Controller {
  async listPosts() {
    const body = this.ctx.request.body;
    // {
    //   title: 'controller',
    //   content: 'what is controller'
    // }
  }
}

返回响应数据

this.ctx.body返回响应数据

class ViewController extends Controller {
  async show() {
    // 返回Content-Type为application/json的body
    this.ctx.body = {
      name: "egg",
      category: "framework",
      language: "Node.js",
    };
  }

  async page() {
    // 返回Content-Type为text/html的body
    this.ctx.body = "<html><h1>Hello</h1></html>";
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1103076.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MFC-列表控件

目录 1、更改列表控件的属性&#xff1a; 2、代码设置表头&#xff1a; 3、设置正文内容&#xff1a; 4、设置属性&#xff0c;显示成表格形式 &#xff1a; 5、代码实现&#xff1a; 1、更改列表控件的属性&#xff1a; VIEW设置为Report模式会出现表格形状 2、代码设置…

C++对象模型(14)-- 构造函数语义学:拷贝构造函数和赋值运算赋

1、拷贝构造函数 1.1 什么是拷贝构造函数 拷贝构造函数是一种构造函数&#xff0c;它的功能是创建新对象。也就是说对象还没生成&#xff0c;这时利用另一个对象的拷贝来生成新的对象。 class MyDemo { public:// 默认构造函数MyDemo(){}// 拷贝构造函数MyDemo(const MyDemo…

【Java 进阶篇】JavaScript DOM Document对象详解

在前端开发中&#xff0c;DOM&#xff08;文档对象模型&#xff09;扮演着重要的角色。它允许我们使用JavaScript来与网页文档进行交互&#xff0c;实现动态的网页效果。DOM的核心部分之一就是Document对象&#xff0c;它代表了整个HTML文档。在本篇博客中&#xff0c;我们将深…

A1S65B-S1 A1S61PN A1SJ51T64 机器人的优点和缺点

A1S65B-S1 A1S61PN A1SJ51T64 机器人的优点和缺点 像今天的任何创新一样&#xff0c;机器人有其优缺点。以下是机器人的优缺点和机器人未来的分析。 优势 他们在危险的环境中工作:当你可以派一个机器人去做这项工作时&#xff0c;为什么要拿人命冒险呢&#xff1f;想想看&a…

电平转换器IC

一、前言 使用多款电平转换器&#xff0c;记录和分享使用心得 目录 1.TXB0104(非国产) 2.RS0104(国产) 二、环境 非隔离电平转换&#xff0c;1.8~5V 三、正文 1.TXB0104(非国产) 芯片简介&#xff1a;A 端口支持 1.2V 至 3.6V 的电压&#xff0c;B 端口支持 1.65V 至 5…

法国数字医疗公司Tilak Healthcare完成1000万欧元融资

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;总部位于法国巴黎的治疗眼科的数字医疗公司Tilak Healthcare今日宣布已完成1000万欧元融资。 本轮融资完成后&#xff0c;Tilak Healthcare的融资总额已达到2200万欧元&#xff0c;本轮融资由Elai…

【软件测试】高频常问自动化测试面试题+答案(汇总)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、你有没有做过自…

linux文件权限与目录配置

用户与用户组 linux一般将文件可读写的身份分为三个类别&#xff1a;拥有者&#xff08;owner&#xff09;、所属群组&#xff08;group&#xff09;、其他人&#xff08;other&#xff09; 三种身份都有读、写、执行等权限 文件拥有者 linux是个多人多任务的系统&#xff0c…

Edge侧实用【AI插件合集】

废话不多说&#xff0c;直接开始正文&#x1f447; 1.ChatsNow ChatsNow是人工智能助手&#xff0c;支持GPT-3.5 和 GPT-4 模型&#xff0c;写作&#xff0c;AI绘画统统不在话下&#xff0c;并且可以增强搜索引擎结果等。 免费使用&#xff0c;提供30次问答次数&#xff0c;…

智慧公厕:打造清新无臭的舒适空间

近年来&#xff0c;智慧公厕成为城市建设中备受关注的一个热点话题。而对于公共厕所最让人头痛的臭味问题&#xff0c;一直困扰着管理单位。为了解决公厕臭味问题&#xff0c;科技力量发挥了重要作用&#xff0c;中期科技「智慧公厕-智慧厕所」推出了一系列公厕除臭设备&#x…

JDBC整合C3P0,DBCP,DRUID数据库连接池

在使用JDBC整合数据库连接操作时,如果需要用到事务,在去关闭Connection conn的时候 注意在关闭前 注意:最好这么做一下 避免下次别人用的时候也自动开启事务,但是自己测试C3P0时候,连接池会自动将状态更新,也就是说,即使关闭前不设置为true,默认连接池也会将状态更新, 这里…

基于饥饿游戏优化的BP神经网络(分类应用) - 附代码

基于饥饿游戏优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于饥饿游戏优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.饥饿游戏优化BP神经网络3.1 BP神经网络参数设置3.2 饥饿游戏算法应用 4.测试结果…

win10系统防火墙 拦截未知程序,怎么在防火墙上放行?

如果您想让防火墙不拦截某些程序&#xff0c;可以按照以下步骤进行操作&#xff1a; 打开控制面板&#xff0c;选择系统和安全&#xff0c;点击Windows Defender防火墙&#xff1a;“Windows Defender防火墙”&#xff0c;打开防火墙设置。 点击“允许应用或功能通过“Windows…

【Java学习之道】数据库的基本概念与分类

引言 在这一章中&#xff0c;我们将一起探讨数据库编程的基础知识和核心技能。作为Java程序员&#xff0c;掌握数据库编程是非常重要的&#xff0c;因为在实际开发过程中&#xff0c;我们经常需要处理大量的数据。通过本章节的学习&#xff0c;你将能够理解数据库的基本概念、…

【LeetCode热题100】--287.寻找重复数

287.寻找重复数 方法&#xff1a;使用快慢指针 使用环形链表II的方法解题&#xff08;142.环形链表II&#xff09;&#xff0c;使用 142 题的思想来解决此题的关键是要理解如何将输入的数组看作为链表。 首先明确前提&#xff0c;整数的数组 nums 中的数字范围是 [1,n]。考虑一…

如何创建响应式前端表单?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

element ui 下拉框 选择月份和天数

一、背景 目前做的管理系统项目&#xff0c;期望实现功能为&#xff1a;设置出账周期和出账日&#xff0c;考虑使用element ui下拉框实现功能 二、所用技术 vue2element ui 三、实现效果 四、具体代码 <template><popup-frame :title"批量设置出账日" …

【Java基础面试十八】、说一说重写与重载的区别

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;说一说重写与重载的区别…

quartz中jdbc.initialize-schema

never&#xff1a;从不进行初始化&#xff0c;也就是不清空数据库 always&#xff1a;每次都清空数据库进行初始化 embedded&#xff1a;只初始化内存数据库&#xff08;默认值&#xff09;

Fluent瞬态结果的时间统计处理

声明&#xff1a;本文基于 2023R2 版&#xff0c;在其他版本中界面操作、可设置内容等可能存在区别。 1 背景 仿真中有时需要对区域上每个位置的结果数据进行统计分析&#xff0c;例如需要统计设备表面的压力脉动情况&#xff0c;并找出压力脉动最大的位置。在Fluent中对结果…