Node.js - Express框架

news2025/1/15 17:07:52

1. 介绍

Express 是一个基于 Node.jsWeb 应用程序框架,主要用于快速、简便地构建 Web 应用程序API。它是目前最流行的 Node.js Web 框架之一,具有轻量级、灵活和功能丰富的特点。

核心概念包括路由,中间件,请求与响应,以及模板引擎支持

2. Express应用的使用

通过npm进行安装express包

npm install express

示例:以下是一个最简单的Express应用程序

const express = require('express');
const app = express();

// 路由:处理 GET 请求
app.get('/', (req, res) => {
    res.send('Hello, Express!');
});

// 路由:处理动态参数
app.get('/user/:id', (req, res) => {
    res.send(`User ID: ${req.params.id}`);
});

// 启动服务器
const PORT = 3000;
app.listen(PORT, () => {
    console.log(`Server is running on http://localhost:${PORT}`);
});

3. 应用程序对象

Express的核心,负责注册路由和中间件。

使用express()函数创建一个Express应用程序的实例。

const app = express();

4. 路由

Express提供了灵活的路由机制,用于定义应用如何响应客户端的请求

get请求

用于从服务器获取资源(例如网页、数据),请求参数通常附加在URL的查询字符串中,适用于获取数据或无敏感信息的请求

const express = require('express');
const app = express();

app.get('/', (req, res) => {
    res.send('欢迎访问首页!');
});

// 带查询参数的 GET 请求
app.get('/search', (req, res) => {
    const query = req.query; // 获取查询参数
    res.send(`搜索内容:${query.keyword}`);
});

app.listen(3000, () => console.log('服务器运行在 http://localhost:3000'));

访问方式:直接在浏览器地址栏输入即可

http://localhost:3000/search?keyword=express

request对象中包含了与HTTP请求相关的信息,例如请求头,URL,参数等信息

属性描述
req.params包含动态路由中的参数,格式为对象。例如:/user/:idreq.params.id 获取 id 参数
req.query包含查询字符串参数,格式为对象。例如:?name=Johnreq.query.name 获取 name 参数
req.body包含 POST 请求的请求体数据,需要中间件解析(如 express.json()express.urlencoded()
req.headers包含 HTTP 请求头信息,格式为对象。
req.headers包含 HTTP 请求头信息,格式为对象
req.methodHTTP 请求的方法,例如:GETPOSTPUTDELETE
req.url请求的完整 URL
req.path请求的路径部分(不包括查询字符串)
req.hostname请求的主机名,不包括端口号
req.ip客户端的 IP 地址

示例:简易的查找返回

const express = require("express")
const file = require("./test.json")
const app = express();

app.get('/singer/:id.html',(req,res)=>{
    let {id} = req.params;
    let result = file.find(item=>{
        if (item.id === Number(id)){return true;}
    })
    if (!result){res.statusCode=404;renderBlock.end(`<h1>404 NOT FOUND<h1>`);return;}
})

post请求

post请求则是用于向服务器提交数据,例如表单数据,JSON数据,通常会改变服务器上的数据,例如添加,修改或删除资源等操作

<!DOCTYPE html>
<html>
    <head>

    </head>
    <body>
        <form method="post" action="http://127.0.0.1:3000/submit">
            <textarea placeholder="输入用户名"></textarea>
            <button>登录</button>
        </from>
    </body>
</html>
const express = require('express');
const app = express();

app.use(express.json()); // 解析 JSON 格式的请求体
app.use(express.urlencoded({ extended: true })); // 解析 URL 编码的请求体

// POST 路由
app.post('/submit', (req, res) => {
    const body = req.body; // 获取请求体数据
    res.send(`提交的数据:${JSON.stringify(body)}`);
});

app.listen(3000, () => console.log('服务器运行在 http://localhost:3000'));

response包含了与HTTP响应相关的方法和属性,用于向客户端返回数据

方法描述
res.send(body)发送响应数据,可以是字符串,对象,Buffer等
res.json(body)发送 JSON 格式的响应
res.status(code)设置响应状态码,例如:res.status(404)
res.redirect(url)重定向到指定 URL
res.render(view, data)渲染视图模板并发送响应(需要配置模板引擎)
res.set(header, value)设置响应头
res.cookie(name, value)设置 Cookie(需要 cookie-parser 中间件)
res.clearCookie(name)清除指定的 Cookie
res.type(type)设置content-type响应头
res.sendFile()返回服务器中的文件
res.end()结束响应,但不发送数据

Response对象常见操作:

跳转响应

app.get('/other',(req,res)=>{res.redirect('http://www.baidu.com')})

下载响应

app.get('/other',(req,res)=>{res.download(__dirname+'/package.json')})

JSON响应

app.get('/other',(req,res)=>{res.json({name:"Ricardo"})})

响应文件内容

用于展示HTML文件等信息

app.get('/other',(req,res)=>{res.sendFile(__dirname+'/test.html')})

4. express中间件

中间件(Middleware) 是 Express 中处理请求和响应的核心机制。它是一个函数,用于处理请求对象 (req)、响应对象 (res),以及在请求-响应周期中执行后续中间件的 next 方法,在路由处理之前或者之后执行。

简单来讲,中间件可以拦截请求、执行某些操作,然后决定是否将请求传递给下一个中间件;它们可以用来处理日志记录、认证、数据解析、错误处理等任务。

中间件的基本形式:

function middleware(req, res, next) {
    // 中间件逻辑
    next(); // 调用 next() 将请求传递给下一个中间件
}

4.1 全局中间件

每一个请求到达服务器之后都会执行全局中间件函数,直接绑定到应用对象app上,作用域所有或指定的路由

const express = require("express");
const path = require("path");
const fs = require("fs");

const app = express();

// 声明中间件函数
function recordMiddleware(req, res, next) {
    let { url, ip } = req;
    fs.appendFileSync(
        path.resolve(__dirname, './access.log'),
        `${url} ${ip}\r\n`
    );
    next(); // 必须调用 next() 将请求传递给后续中间件或路由
}

// 使用中间件
app.use(recordMiddleware);

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

app.get('/admin', (req, res) => {
    res.send('后台');
});

// 处理 404 请求
app.all('*', (req, res) => {
    res.send("<h1>404 NOT FOUND</h1>");
});

// 启动服务器
app.listen(3000, () => {
    console.log("The server started on port 3000");
});

4.2 专有/路由级中间件

与路由绑定,仅作用于特定路由

function recordMiddleware(req, res, next) {
    let { url, ip } = req;
    fs.appendFileSync(
        path.resolve(__dirname, './access.log'),
        `${url} ${ip}\r\n`
    );
    next(); // 必须调用 next() 将请求传递给后续中间件或路由
}


app.get('/home', recordMiddleware,(req, res) => {
    res.send("Hello express");
});

需要在中间件中声明next才会进一步执行之后回调函数的内容

4.3 静态资源/内置中间件

app.use(express.static(__dirname+'/public'));

根据在public文件夹下的路径即可访问对应的文件

如果public目录下有index.html文件,单独有index.html路由的话,根目录代码'/'书写谁在前显示谁

中间件描述安装
express.json()解析 JSON 格式请求体内置
express.urlencoded()解析 URL 编码请求体(如表单数据)内置
express.static()提供静态文件服务内置
morgan记录 HTTP 请求日志需要安装
cookie-parser解析请求中的 Cookie需要安装
cors处理跨域请求需要安装
helmet提高应用安全性需要安装
body-parser解析请求体数据,功能与 express.json() 类似需要安装
express-session管理会话需要安装

示例:中间件获取解析请求参数

首先,准备好我们的表单界面与服务端

<!DOCTYPE html>
<html>
    <head></head>
    <body>
        <form action="http://127.0.0.1:3000/login" method="post">
            用户名:<input type="text" name="username"><br>
            密码:<input type="password" name="password"><br>
            <button>登录</button>
        </form>
    </body>
</html>
const express = require("express")

const app = express();

app.get('/login',(req,res)=>{
    res.sendFile(__dirname+'/form.html')
})

app.post('/login',(req,res)=>{
    res.send('获取用户的数据')
})

app.listen(3000,()=>{
    console.log('server is running...')
})

name=John&age=25

表单所返回的数据如上述所示,我们需要在服务器端获取上述表单内容,需要使用到中间件 

使用中间件解析post请求所获得的数据

const urlencodedParser = express.urlencoded({ extended: false });

使用中间件:

app.post('/login',urlencodedParser,(req,res)=>{
    console.log(req.body)
    res.send('获取用户的数据')
})

解析后的数据存放在req中body属性中,解析的内容以对象的形式进行保存

{ name: 'John', age: '25' }

示例:防盗链

防止其他网站对资源进行访问,通过header请求头中refer所实现

app.use((req,res,next)=>{
    let referer = req.get('referer');
    if (referer){
        let url = new URL(referer);
        let hostname = url.hostname; //获取站点信息
        if (hostname !== '127.0.0.1')
            {res.status(404).send('<h1>404 NOT FOUND</h1>')}
}
})

注意事项

1. 中间件顺序很重要:中间件按照定义顺序执行。

2. 确保调用next()如果不调用,后续中间件将不会执行。

5. 路由器(Router)

定义路由器级别的路由,用于为某一组路由逻辑进行模块化管理(即创建“迷你应用”)。

它的作用范围是局部的,绑定在特定的 Router 实例上。

反之使用app.get用于处理直接挂载到整个应用程序上的 HTTP GET 请求,作用范围是全局的,绑定在整个 Express 应用实例上。

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

router.get('/about', (req, res) => res.send('关于页面'));
router.get('/contact', (req, res) => res.send('联系我们'));

app.use('/info', router); // 将路由器挂载到 /info 路径

app.listen(3000);

最终访问路由:

3000/info/about

6. 路由模块化

单独创建一个文件夹用于存储不同作用的路由文件

//   ./routes/网站首页.js
const express = require('express')

const router = express()

router.get('/home',(req,res)=>{
    res.send("网站首页")
})

module.exports = router;

模块化进行声明导出,方便在主文件中进行使用

- 在主文件中配置路由,使用use挂载即可

//  ./主文件.js

const express = require("express");
const router = require('./route/home.js')

const app = express();

app.use(router);

app.all("*",(req,res)=>{
    res.send("<h1>404 NOT FOUND<h1>")
})

app.listen(3000,()=>{
    console.log("This server has been started")
})

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

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

相关文章

Linux Top 命令 load average 指标解读

前言 作为平台开发的同学&#xff0c;维护平台稳定性是我们最基本的工作职责&#xff0c;下面主要介绍下top 命令里 &#xff0c;load average 这个指标如何去衡量机器负载程度。 概念介绍 load average 是系统在过去 1 分钟、5 分钟、15 分钟 的平均负载&#xff0c;它表示运…

【大数据】机器学习------神经网络模型

一、神经网络模型 1. 基本概念 神经网络是一种模拟人类大脑神经元结构的计算模型&#xff0c;由多个神经元&#xff08;节点&#xff09;组成&#xff0c;这些节点按照不同层次排列&#xff0c;通常包括输入层、一个或多个隐藏层和输出层。每个神经元接收来自上一层神经元的输…

【day5】Redis持久化之AOF + Redis事务_锁机制

AOF是什么 以日志的形式来记录每个写操作(增量保存)&#xff0c;将 Redis 执行过的所有写指令记录下来(比 如 set/del 操作会记录, 读操作 get 不记录 只许追加文件但不可以改写文件 redis 启动之初会读取该文件重新构建数据 redis 重启的话就根据日志文件的内容将写指令从前到…

【Python】Python之locust压测教程+从0到1demo:基础轻量级压测实战(1)

文章目录 一、什么是Locust二、Locust 架构组成三、实战 Demo准备一个可调用的接口编写一个接口测试用例编写一个性能测试用例执行性能测试用例代码1、通过 Web UI 执行&#xff08;GUI模式&#xff09;2、通过命令行执行&#xff08;非GUI模式&#xff09; 小知识&#xff1a;…

Jaeger UI使用、采集应用API排除特定路径

Jaeger使用 注&#xff1a; Jaeger服务端版本为&#xff1a;jaegertracing/all-in-one-1.6.0 OpenTracing版本为&#xff1a;0.33.0&#xff0c;最后一个版本&#xff0c;停留在May 06, 2019。最好升级到OpenTelemetry。 Jaeger客户端版本为&#xff1a;jaeger-client-1.3.2。…

基于Python机器学习、深度学习技术提升气象、海洋、水文领域实践应用-以ENSO预测为例讲解

1. 背景与目标 ENSO&#xff08;El Nio-Southern Oscillation&#xff09;是全球气候系统中最显著的年际变率现象之一&#xff0c;对全球气候、农业、渔业等有着深远的影响。准确预测ENSO事件的发生和发展对于减灾防灾具有重要意义。近年来&#xff0c;深度学习技术在气象领域…

【IDEA 2024】学习笔记--文件选项卡

在我们项目的开发过程中&#xff0c;由于项目涉及的类过多&#xff0c;以至于我们会打开很多的窗口。使用IDEA默认的配置&#xff0c;个人觉得十分不便。 目录 一、设置多个文件选项卡按照文件字母顺序排列 二、设置多个文件选项卡分行显示 一、设置多个文件选项卡按照文件字…

nginx的可视化配置工具nginxWebUI的使用

文章目录 1、nginx简介2、nginxWebUI2.1、技术解读2.2、开源版和专业版之间的区别2.3、功能解读 3、安装与使用3.1、下载镜像3.2、查看镜像3.3、启动容器3.4、使用 4、总结 1、nginx简介 Nginx 是一个高效的 HTTP 服务器和反向代理&#xff0c;它擅长处理静态资源、负载均衡和…

qt vs ios开发应用环境搭建和上架商店的记录

qt 下载链接如下 https://download.qt.io/new_archive/qt/5.14/5.14.2/qt-opensource-mac-x64-5.14.2.dmg 安装选项全勾选就行&#xff0c;这里特别说明下qt5.14.2/qml qt5.14.2对qml支持还算成熟&#xff0c;但很多特性还得qt6才行&#xff0c;这里用qt5.14.2主要是考虑到服…

系统思考—全局思维

在一个复杂的企业中&#xff0c;无论是生产、营销、研发、产品还是采购&#xff0c;作为核心团队&#xff0c;大家不只关注单一的问题——需要从整体出发。企业是一个有机的整体&#xff0c;每一个环节都息息相关。如果只解决一个问题&#xff0c;却忽视了其他部分的相互作用&a…

软件设计师 - 第10章 网络与信息安全基础知识

网络概述 功能:数据通信,资源共享,管理集中化,实现分布式处理,负载均衡 分类:局域网,城域网,广域网 拓扑结构:总线型,星型,环型,树型,分布式 ISO/OSI七层模型: 应用层:提供与用户交互的界面,并支持特定应用程序的服务,FTP、Telnet、SMTP、NFS、SNMP、HTTP、…

记录一次Android Studio的下载、安装、配置

目录 一、下载和安装 Android Studio 1、搜索下载Android studio ​2、下载成功后点击安装包进行安装&#xff1a; 3、这里不用打勾&#xff0c;直接点击安装 &#xff1a; 4、完成安装&#xff1a; 5、这里点击Cancel就可以了 6、接下来 7、点击自定义安装&#xff1a…

自定义注解使用AspectJ切面和SpringBoot的Even事件优雅记录业务接口及第三方接口调用日志实现思路

自定义注解使用AspectJ切面和SpringBoot的Even事件优雅记录业务接口及第三方接口调用日志实现思路 文章目录 1.前言2.思路2.1使用ELK收集日志2.1.1ELK搭建2.1.2项目中集成ELK日志收集2.1.2.1 引入依赖2.1.2.2 logback-xxx.xml配置2.1.2.3 yaml配置 2.2本文思路2.2.1书接上文--自…

Windows 正确配置android adb调试的方法

下载适用于 Windows 的 SDK Platform-Tools https://developer.android.google.cn/tools/releases/platform-tools?hlzh-cn 设置系统变量&#xff0c;路径为platform-tools文件夹的绝对路径 点击Path添加环境变量 %adb%打开终端输入adb shell 这就成功了&#xff01;

保姆级图文详解:Linux和Docker常用终端命令

文章目录 前言1、Docker 常用命令1.1、镜像管理1.2、容器管理1.3、网络管理1.4、数据卷管理1.5、监控和性能管理 2、Linux 常用命令分类2.1、文件和目录管理2.2、用户管理2.3、系统监控和性能2.4、软件包管理2.5、网络管理 前言 亲爱的家人们&#xff0c;技术图文创作很不容易…

相机SD卡照片数据不小心全部删除了怎么办?有什么方法恢复吗?

前几天&#xff0c;小编在后台友收到网友反馈说他在整理相机里的SD卡&#xff0c;原本是想把那些记录着美好瞬间的照片导出来慢慢欣赏。结果手一抖&#xff0c;不小心点了“删除所有照片”&#xff0c;等他反应过来&#xff0c;屏幕上已经显示“删除成功”。那一刻&#xff0c;…

《C++11》nullptr介绍:从NULL说起

在C11之前&#xff0c;我们通常使用NULL来表示空指针。然而&#xff0c;NULL在C中有一些问题和限制&#xff0c;这就是C11引入nullptr的原因。本文将详细介绍nullptr的定义、用法和优点。 1. NULL的问题 在C中&#xff0c;NULL实际上是一个整数0&#xff0c;而不是一个真正的…

【搭建JavaEE】(2)Tomcat安装配置和第一个JavaEE程序

Tomcat–容器(Container) 下载 Apache Tomcat - Welcome! 下载完成 请求/响应 结构 测试 查看Jdk版本 改端口号localhost8080–>8099 学学人家以后牛逼了可以用自己名字当文件夹名 配置端口8099 找到server文件 用记事本打开 再打开另一个logging文件 ”乱码解决“步骤&…

​​​​​​​​​​​​​​★3.3 事件处理

★3.3.1 ※MouseArea Item <-- MouseArea 属性 acceptedButtons : Qt::MouseButtons containsMouse : bool 【书】只读属性。表明当前鼠标光标是否在MouseArea上&#xff0c;默认只有鼠标的一个按钮处于按下状态时才可以被检测到。 containsPress : bool curs…

【C】初阶数据结构3 -- 单链表

之前在顺序表那一篇文章中&#xff0c;提到顺序表具有的缺点&#xff0c;比如头插&#xff0c;头删时间复杂度为O(n)&#xff0c;realloc增容有消耗等。而在链表中&#xff0c;这些问题将得到解决。所以在这一篇文章里&#xff0c;我们将会讲解链表的定义与性质&#xff0c;以及…