86 # express 基本实现

简介: 86 # express 基本实现

koa 和 express 的区别

  • koa 内部原理使用 es6 来编写的(promise async + await),express 是使用 es5 来编写的,内部是基于回调函数来实现
  • express 内置了很多中间件(功能会比 koa 强大一些,内部集成了路由,静态服务,模板引擎)
  • express 本身会大一些,koa 主要关注的是核心(use)
  • koa(基于 promise) 和 express(基于回调) 中间件有一些差异,错误处理也不一样
  • webpack-dev-server 内部使用的是 express
  • 开发人员是同一波,应用层面来说基本一致
  • koa 的 ctx 上下文有 (req,res,request,response),而 express 直接对 res 和 req 进行了拓展

安装 express

npm init -y
npm i express

编写一个 express demo

const express = require("express");
const app = express();
// 调用回调时 会将原生的 req 和 res 传入(req,res 在内部也被扩展了)
// 内部不会将回调函数包装成 promise
app.get("/", (req, res) => {
    res.end("ok");
});
app.get("/add", (req, res) => {
    res.end("add");
});
app.listen(3000, () => {
    console.log(`server start 3000`);
    console.log(`在线访问地址:http://localhost:3000/`);
});

express 源码目录结构

├── index.js:入口文件,没有 main 入口,默认通过 index.js 入口找到 `lib/express`
├── lib
│   ├── middleware:中间件 内置了中间件
│   ├── router:路由系统
│   ├── application.js:应用
│   ├── request.js:用来拓展 req
│   ├── response.js:用来拓展 res
│   ├── utils.js:工具方法
│   └── view.js:模板引擎

express 基本实现

下面完成这个功能,有一个默认的路由,默认找不到时会执行 404 功能,配置的路由会默认从上到下来进行匹配

先新建 kaimo-express 文件夹,添加对应的文件

index.js

// 找到 express 的入口
console.log("使用的是 kaimo-express");
module.exports = require("./lib/express");

express.js

const http = require("http");
const url = require("url");
const routers = [
    {
        path: "*",
        method: "all",
        handler: (req, res) => {
            res.end(`kaimo-express Cannot ${req.method} ${req.url}`);
        }
    } // 默认路由
];
function createApplication() {
    return {
        get(path, handler) {
            routers.push({
                path,
                method: "get",
                handler
            });
        },
        listen() {
            const server = http.createServer((req, res) => {
                const { pathname } = url.parse(req.url);
                const requestMethod = req.method.toLowerCase();
                for (let i = 1; i < routers.length; i++) {
                    let { path, method, handler } = routers[i];
                    if (path === pathname && method === requestMethod) {
                        return handler(req, res);
                    }
                }
                return routers[0].handler(req, res);
            });
            server.listen(...arguments);
        }
    };
}
module.exports = createApplication;

下面引用自己的 kaimo-express 测试

const express = require("./kaimo-express");
const app = express();
// 调用回调时 会将原生的 req 和 res 传入(req,res 在内部也被扩展了)
// 内部不会将回调函数包装成 promise
app.get("/", (req, res) => {
    res.end("ok");
});
app.get("/add", (req, res) => {
    res.end("add");
});
app.listen(3000, () => {
    console.log(`server start 3000`);
    console.log(`在线访问地址:http://localhost:3000/`);
});

访问 http://localhost:3000/add

访问 http://localhost:3000/kaimo313

目录
相关文章
|
安全 Linux
Linux命令(38)之mount
Linux命令(38)之mount
496 1
|
前端开发
webpack如何设置devServer启动项目为https协议
webpack如何设置devServer启动项目为https协议
2077 0
|
Ubuntu
Ubuntu 安装使用yum
Ubuntu 安装使用yum
3450 0
|
网络协议 网络安全 数据安全/隐私保护
计算机网络概念:网关,DHCP,IP寻址,ARP欺骗,路由,DDOS等
计算机网络概念:网关,DHCP,IP寻址,ARP欺骗,路由,DDOS等
316 4
|
机器学习/深度学习 人工智能 物联网
未来操作系统的发展趋势与挑战
随着科技的不断进步,操作系统作为计算机系统的核心组成部分,在未来将面临更多的挑战与机遇。本文从人工智能、云计算、物联网等方面探讨未来操作系统的发展趋势,以及可能面临的挑战,并提出相应的应对策略。
156 2
|
存储 算法 数据库
Python 抽奖程序限定次数详解
构建Python抽奖程序,限定用户抽奖次数,使用字典存储用户ID及抽奖次数。`LotterySystem`类包含判断、记录和抽奖方法。当用户达到最大抽奖次数(默认3次)时,禁止继续。示例展示如何创建系统,模拟用户抽奖,并扩展功能如动态调整次数和多用户、多奖品池。性能优化可通过数据持久化和并发控制实现。
|
存储 人工智能 大数据
【一图看懂】云存储“4任意+3智能”升级,以数据驱动AI创新
阿里云围绕Storage for AI与AI in Storage两大领域,对其存储服务进行全面升级。
|
人工智能 运维 监控
人工智能如何影响后端开发
【6月更文挑战第1天】人工智能如何影响后端开发
664 2
|
监控 安全 Java
【多线程学习】深入探究阻塞队列与生产者消费者模型和线程池常见面试题
【多线程学习】深入探究阻塞队列与生产者消费者模型和线程池常见面试题
376 1
|
SQL 关系型数据库 数据库
SQL 审核:基于PG数据库插件hook的SQL规范审核工具
此议题的主题是PG数据库插件和SQL规范审核相关的内容。首先了解一下hook技术的基本原理。接下来将介绍一下SQL语句在PG数据库的分析解析和执行过程。然后结合hook和SQL执行过程介绍一下SQL规范审核这个插件,聊一聊该插件的实现原理。最后做一下展望。
2914 0

热门文章

最新文章