首页 > 其他分享 >Express框架

Express框架

时间:2023-07-08 20:33:23浏览次数:30  
标签:req const 框架 res app Express 中间件 路由

用内置 http 模块创建服务器

创建 server.js 文件,代码如下:

const http = require('http');

const hostname = 'localhost';
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/html');
  res.end('Hello World\n');
});

server.listen(port, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

可以发现,直接用内置的 http 模块去开发服务器有以下明显的弊端:

  • 需要写很多底层代码——例如手动指定 HTTP 状态码和头部字段,最终返回内容。如果我们需要开发更复杂的功能,涉及到多种状态码和头部信息(例如用户鉴权),这样的手动管理模式非常不方便
  • 没有专门的路由机制——路由是服务器最重要的功能之一,通过路由才能根据客户端的不同请求 URL 及 HTTP 方法来返回相应内容。但是上面这段代码只能在 http.createServer 的回调函数中通过判断请求 req 的内容才能实现路由功能,搭建大型应用时力不从心

由此就引出了 Express 对内置 http 的两大封装和改进:

  • 更强大的请求(Request)和响应(Response)对象,添加了很多实用方法
  • 灵活方便的路由的定义与解析,能够很方便地进行代码拆分

用 Express 搭建服务器

在开始用 Express 改写上面的服务器之前,我们先介绍一下上面提到的两大封装与改进。

更强大的 Request 和 Response 对象

首先是 Request 请求对象,通常我们习惯用 req 变量来表示。下面列举一些 req 上比较重要的成员(如果不知道是什么也没关系哦):

  • req.body:客户端请求体的数据,可能是表单或 JSON 数据
  • req.params:请求 URI 中的路径参数
  • req.query:请求 URI 中的查询参数
  • req.cookies:客户端的 cookies

然后是 Response 响应对象,通常用 res 变量来表示,可以执行一系列响应操作,例如:

// 发送一串 HTML 代码
res.send('HTML String');

// 发送一个文件
res.sendFile('file.zip');

// 渲染一个模板引擎并发送
res.render('index');

路由机制

客户端(包括 Web 前端、移动端等等)向服务器发起请求时包括两个元素:路径(URI)以及 HTTP 请求方法(包括 GET、POST 等等)。路径和请求方法合起来一般被称为 API 端点(Endpoint)。而服务器根据客户端访问的端点选择相应处理逻辑的机制就叫做路由。

在 Express 中,定义路由只需按下面这样的形式:

app.METHOD(PATH, HANDLER)

其中:

  • app 就是一个 express 服务器对象
  • METHOD 可以是任何小写的 HTTP 请求方法,包括 get、post、put、delete 等等
  • PATH 是客户端访问的 URI,例如 / 或 /about
  • HANDLER 是路由被触发时的回调函数,在函数中可以执行相应的业务逻辑

正式实现

到了动手的时候了,我们用 Express 改写上面的服务器,代码如下:

const express = require('express');

const hostname = 'localhost';
const port = 3000;

const app = express();
app.get('/', (req, res) => {
  res.send('Hello World');
});

app.listen(port, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

在上面的代码中,我们首先用 express() 函数创建一个 Express 服务器对象,然后用上面提到的路由定义方法 app.get 定义了主页 / 的路由,最后同样调用 listen 方法开启服务器。

中间件

理解中间件

Express 的简化版中间件流程如下图所示:

首先客户端向服务器发起请求,然后服务器依次执行每个中间件,最后到达路由,选择相应的逻辑来执行。

提示
这个是一个简化版的流程描述,目的是便于你对中间件有个初步的认识,在后面的章节中我们将进一步完善这一流程。

有两点需要特别注意:

  • 中间件是按顺序执行的,因此在配置中间件时顺序非常重要,不能弄错
  • 中间件在执行内部逻辑的时候可以选择将请求传递给下一个中间件,也可以直接返回用户响应

在 Express 中,中间件就是一个函数:

function someMiddleware(req, res, next) {
  // 自定义逻辑
  next();
}

三个参数中,req 和 res 就是前面提到的 Request 请求对象和 Response 响应对象;而 next 函数则用来触发下一个中间件的执行。

注意
如果忘记在中间件中调用 next 函数,并且又不直接返回响应时,服务器会直接卡在这个中间件不会继续执行下去哦!

在 Express 使用中间件有两种方式:全局中间件和路由中间件。

全局中间件

通过 app.use 函数就可以注册中间件,并且此中间件会在用户发起任何请求都可能会执行,例如:

app.use(someMiddleware);

路由中间件

通过在路由定义时注册中间件,此中间件只会在用户访问该路由对应的 URI 时执行,例如:

app.get('/middleware', someMiddleware, (req, res) => {
  res.send('Hello World');
});

那么用户只有在访问 /middleware 时,定义的 someMiddleware 中间件才会被触发,访问其他路径时不会触发。

使用子路由拆分逻辑

当我们的网站规模越来越大时,把所有代码都放在 server.js 中可不是一个好主意。“拆分逻辑”(或者说“模块化”)是最常见的做法,而在 Express 中,我们可以通过子路由 Router 来实现。

const express = require('express');
const router = express.Router();

express.Router 可以理解为一个迷你版的 app 对象,但是它功能完备,同样支持注册中间件和路由:

// 注册一个中间件
router.use(someMiddleware);

// 添加路由
router.get('/hello', helloHandler);
router.post('/world', worldHandler);

最后,由于 Express 中“万物皆中间件”的思想,一个 Router 也作为中间件加入到 app 中:

app.use('/say', router);

这样 router 下的全部路由都会加到 /say 之下,即相当于:

app.get('/say/hello', helloHandler);
app.post('/say/world', worldHandler);

正式实现

到了动手环节,首先创建 routes 目录,用于存放所有的子路由。
创建 routes/api.js,代码如下:

const express = require('express');
const router = express.Router();

router.get('/', (req, res) => {
  res.json({ name: '图雀社区', website: 'https://tuture.co' });
});

router.post('/new', (req, res) => {
  res.status(201).json({ msg: '新的篇章,即将开始' });
});

module.exports = router;

最后我们把 server.js 中老的路由定义全部删掉,替换成刚刚实现的两个 Router,代码如下:

const express = require('express');
const apiRouter = require('./routes/api');

const hostname = 'localhost';
const port = 3000;

const app = express();

app.use('/', indexRouter);
app.use('/api', apiRouter);

app.use('*', (req, res) => {
  res.status(404).render('404', { url: req.originalUrl });

});

标签:req,const,框架,res,app,Express,中间件,路由
From: https://www.cnblogs.com/marshban/p/17537804.html

相关文章

  • 从零用python flask框架写一个简易的网站
    要用Python写一个网站,你可以使用Python的Web框架来开发。常见的PythonWeb框架包括Django、Flask、Bottle等。以下是一个简单的使用Flask框架开发的示例。1.安装Flask在开始开发之前,你需要安装Flask框架。你可以使用以下命令来安装:pipinstallflask2.创建Flask应用在安装......
  • 一篇读懂React、vue框架的生命周期函数
    原文合集地址如下,有需要的朋友可以关注本文地址合集地址当涉及到前端框架时,React和Vue.js是两个非常受欢迎的选择。它们都提供了强大的工具和功能,帮助开发者构建交互式的、可扩展的应用程序。在这两个框架中,生命周期函数是一个重要的概念,它们允许我们在组件的不同阶段执行特......
  • 神奇的发现——所有的aarch64架构的CPU平台下的深度学习框架均不原生支持CUDA
    一个记录:神奇的发型——所有的aarch64架构的CPU平台下的深度学习框架均不原生支持CUDA  不论是mindspore、pytorch、TensorFlow框架只要是aarch64架构的CPU下的系统平台均是原生不支持CUDA版本的,如果你想要在aarch64架构下使用支持CUDA的深度学习框架就必须要在深度学习框架......
  • pytest + yaml 框架 -48.仅收集用例失败错误信息和log日志
    前言有小伙伴提到能不能只收集用例失败的情况下日志和错误信息,每个用例都收集日志内容太多了,没法直观的看错误的用例信息。v1.3.9版本实现此功能,在原有的功能上新增一个log日志文件,仅收集用例错误的日志。log日志收集用例执行完会默认生成2个日志文件全量日志,每个用例的日......
  • 10个适合后端程序员的前端框架
    思维导航前言AdminLTEGentelellalayuiminiMaterializevue-element-adminvue-admin-betterAntDesignVuevue-vben-adminngx-adminreact-adminDotNetGuide技术交流群前言对于后端程序员而言选择一款操作简单、美观、简洁的前端框架对于我们生成效率的提高是极具......
  • 源码分析 | MySQL测试框架 MTR 系列教程(三):源码篇
    作者:卢文双资深数据库内核研发序言:以前对MySQL测试框架MTR的使用,主要集中于SQL正确性验证。近期由于工作需要,深入了解了MTR的方方面面,发现MTR的能力不仅限于此,还支持单元测试、压力测试、代码覆盖率测试、内存错误检测、线程竞争与死锁等功能,因此,本着分享的精神,将其......
  • 特性介绍 | MySQL测试框架 MTR 系列教程(四):语法篇
    作者:卢文双资深数据库内核研发序言:以前对MySQL测试框架MTR的使用,主要集中于SQL正确性验证。近期由于工作需要,深入了解了MTR的方方面面,发现MTR的能力不仅限于此,还支持单元测试、压力测试、代码覆盖率测试、内存错误检测、线程竞争与死锁等功能,因此,本着分享的精神,将其......
  • 自己动手实现rpc框架(二) 实现集群间rpc通信
    自己动手实现rpc框架(二)实现集群间rpc通信1.集群间rpc通信上一篇博客中MyRpc框架实现了基本的点对点rpc通信功能。而在这篇博客中我们需要实现MyRpc的集群间rpc通信功能。自己动手实现rpc框架(一)实现点对点的rpc通信上篇博客的点对点rpc通信实现中,客户端和服务端的ip......
  • RAT蓝队自动化测试框架
    RAT是根据MITREATT&CK战术矩阵测试蓝队检测能力的脚本框架,由python2.7编写,共有50多种不同ATT&CK技术点和编译好的exe程序,根据蓝队人员需要选择进程注入、持久化等操作。仓库地址https://github.com/endgameinc/RTA/tree/master环境要求Python2.7部分脚本依赖如......
  • Kotlin协程:打破线程框架的思维
    Kotlin协程:打破线程框架的思维前言协程是Kotlin对比Java的最大优势,需要理解协程的设计理念和知识体系,建立协程思维模型。本文将介绍协程的概念、特性和原理,以及如何在Android开发中使用协程来简化并发编程和优化软件架构。什么是协程协程是一种互相协作的程序,可以在任意地方挂......