当前位置: 首页 > news >正文

从0到1学习node.js(express模块)

文章目录

        • Express框架
          • 1、初体验express
          • 2、什么是路由
          • 3、路由的使用
          • 3、获取请求参数
          • 4、电商项目商品详情场景配置路由占位符规则
          • 5、小练习,根据id参数返回对应歌手信息
          • 6、express和原生http模块设置响应体的一些方法
          • 7、其他响应设置
          • 8、express中间件
            • 8.1、什么是中间件
            • 8.2、中间件的作用
            • 8.3、中间件的类型
            • 8.4、定义全局中间件
            • 8.5、定义路由中间件
            • 8.6、静态资源中间件
          • 9、获取请求体数据
          • 10、防盗链的实现
          • 11、路由的模块化

Express框架
1、初体验express
// 导入express包
const express = require('express')// 创建应用对象
const app = express()// 创建路由
app.get('/home', (req, res) => {res.end('hello express')
})// 启动服务监听端口
app.listen(3000, ()=>{console.log('服务启动成功。。。')
})
2、什么是路由

官方定义:路由确定了应用程序如何响应客户端对特定端点的请求

3、路由的使用
// 导入express包
const express = require('express')// 创建应用对象
const app = express()// 创建路由
app.get('/home', (req, res) => {res.end('hello express')
})// 创建路由
app.post('/login', (req, res) => {res.end('login')
})// 匹配全部
app.all('/all', (req, res) => {res.end('all')
})// 全都匹配不上就走这里
app.all('*', (req, res) => {res.end('Not Found 404')
})// 启动服务监听端口
app.listen(3000, ()=>{console.log('服务启动成功。。。')
})
3、获取请求参数
const express = require('express')// 创建应用对象
const app = express()app.get('/request', (req, res) => {// http模块方法console.log('原生获取url         ', req.url)console.log('原生获取请求方式     ', req.method)console.log('原生获取http版本号   ',req.httpVersion)console.log('原生获取headers     ',req.headers)// express 封装的方法console.log('express获取url      ', req.path)console.log('express获取请求参数  ',req.query);// 获取ip地址console.log('express获取ip地址    ', req.ip);// 获取指定headers中的内容console.log('express获取指定header',req.get('host'))res.setHeader('content-type', 'text/html;charset=utf-8')res.end('请求成功!')
})app.listen(3000, () => {console.log('服务启动成功,监听端口3000')
})

在这里插入图片描述

在这里插入图片描述

4、电商项目商品详情场景配置路由占位符规则
// 导入express模块
const express = require('express')
// 创建应用对象
const app = express()// 创建路由
// :id占位符,所有这种格式的请求都会进入这里
app.get('/:id.html', (req, res) => {// params上存储所有的请求参数,id就是路由中的id,字段名必须一致才能取出来console.log(req.params.id)res.setHeader('content-type', 'text/html;charset=utf-8')res.end('商品详情')
})// 启动服务
app.listen(3000, () => {console.log('服务启动成功,监听端口3000')
})
5、小练习,根据id参数返回对应歌手信息
const express = require('express')const app = express()const singers = [{name: '周杰伦',id: 1},{name: '许嵩',id: 2},{name: '汪苏泷',id: 3}
]
// 根据id返回指定数据
app.get('/:id.html', (req, res) => {const data = singers.filter(item => item.id == req.params.id)console.log(data)if (data.length == 0) {res.statusCode = 404res.end('<h1>404 Not Found</h1>')return}res.setHeader('content-type', 'text/html;charset=utf-8')res.end(JSON.stringify(data[0]))
})app.listen(3000, () => {console.log('服务启动成功')
})
6、express和原生http模块设置响应体的一些方法
const express = require('express')const app = express()app.get('/response', (req, res) => {// 原生方法// 修改状态码res.statusCode = 404res.statusMessage = 'abcd'// 设置响应头res.setHeader('111', '222')// 设置响应体res.write('hello express')res.end('response')// express 方法res.status(500)res.set('aaa','bbb')res.send('你好 我是send') // 使用send会自动配置响应头Content-Type:text/html; charset=utf-8,中文不乱码res.status(500).set('aaa','bbb').send('你好 我是send') // 可以链式调用
})app.listen(3000, () => {console.log('服务启动成功')
})
7、其他响应设置
const express = require('express')const app = express()app.get('/other', (req, res) => {// 重定向res.redirect('http://www.baidu.com')// 下载res.download(__dirname + '/index.js')// JSON响应res.json({name:'你好'})// 响应文件内容res.sendFile(__dirname + './text.html')
})app.listen(3000, () => {console.log('服务启动成功')
})
8、express中间件
8.1、什么是中间件

中间件本质是一个回调函数
中间件函数可以像路由回调一样访问请求对象(request),响应对象(response)

8.2、中间件的作用

中间件的作用就是使用函数封装公共操作,简化代码

8.3、中间件的类型
  • 全局中间件
  • 路由中间件
8.4、定义全局中间件
// 导入
const express = require('express')
const fs = require('fs')
const path = require('path')const app = express()// 声明中间件函数,共有三个参数,请求报文。响应报文。和next函数
// next()函数如果后续有代码执行,必须调用。
function recordMiddleware(req, res, next) {// 获取url和IP地址let { url, ip } = reqfs.appendFileSync(path.resolve(__dirname, './access.log'), `ip${ip}访问了${url}\r\n`)next()
}// 使用中间件函数
app.use(recordMiddleware)app.get('/home', (req, res) => {res.send('前台首页')
})app.get('/admin', (req, res) => {res.send('后台首页')
})app.all('*', (req, res) => {res.send('<h1>404 Not Found</h1>')
})app.listen(3000, () => {console.log('服务启动成功')
})
8.5、定义路由中间件
const express = require('express')// 创建应用对象
const app = express()// 定义全局路由中间价函数
const checkCodeMiddleware = (req, res, next) => {let { code } = req.queryif (code != '521') {res.send('暗号错误!')return}next()
}// 可以全局注册也可以局部使用,直接在路由中调用
app.get('/home', checkCodeMiddleware, (req, res) => {res.send('前台页面')
})app.get('/admin', (req, res) => {res.send('后台页面')
})app.listen(3000, () => {console.log('服务启动成功...')
})
8.6、静态资源中间件
// 静态资源中间件设置, public就是静态资源目录。配置以后不管任何文件格式,这个方法都会给我们配置好mime类型。
app.use(express.static(__dirname + '/public'))
9、获取请求体数据

要使用到一个中间件body-parser,这个中间件有两个方法
先安装中间件npm i body-parser

const bodyParser = require('body-parser')
// 解析JSON格式的请求体的中间件
const jsonParser = bodyParser.json()
// 解析 querystring 格式请求体的中间件
const urlencodedParser = bodyParser.urlencoded({extended:false})app.post('/login', urlencodedParser, (req,res)=>{// 调用这个中间件以后,会给req中添加一个body,就是请求参数const {username} = req.bodyres.send(username)
})
10、防盗链的实现

防盗链就是指一个网站的一些静态资源,通过判断请求头中的referer属性是否为本服务ip或者域名,从而阻止一些外部系统访问资源

const express = require('express')const app = express()// 静态资源中间价设置
app.use(express.static(__dirname + '/public'))// 防盗链的原理主要是判断请求头中的referer 是否为自己服务的地址
const staticMiddleware = (req, res, next) => {// 检测请求头中的referer是否为 127.0.0.1// 获取refererlet referer = req.get('referer')if (referer) {// 序列化refererlet url = new URL(referer)let hostname = url.hostnameconsole.log(hostname)if (hostname !== '127.0.0.1') {// 响应404res.status(404).send('<h1>404 Not Found</h1>')}}next()
}app.use(staticMiddleware)app.get('/login', (req, res) => {res.send('登录')
})app.listen(3000, () => {console.log('服务启动成功...')
})
11、路由的模块化

创建一个routers目录。创建homeRouters.js文件存放路由

const express = require('express')
// 创建路由对象
const router = express.Router()router.get('/admin', (req, res) => {res.send('后台管理')
})// 暴露router
module.exports = router 

主要文件引入routers里面的文件,使用app.use挂载到app上

const express = require('express')
const homeRouters = require('./routers/home.js')
const adminRouters = require('./routers/admin.js')const app = express()app.use(homeRouters)
app.use(adminRouters)app.all('*', (req, res) => {res.send('<h1>404 Not Found</h1>')
})app.listen(3000, () => {console.log('服务启动成功...')
})

全部文章
从0到1学习node.js(fs模块)
从0到1学习node.js(path模块以及HTTP协议)
从0到1学习node.js(http模块)
从0到1学习node.js(npm)

相关文章:

从0到1学习node.js(express模块)

文章目录 Express框架1、初体验express2、什么是路由3、路由的使用3、获取请求参数4、电商项目商品详情场景配置路由占位符规则5、小练习&#xff0c;根据id参数返回对应歌手信息6、express和原生http模块设置响应体的一些方法7、其他响应设置8、express中间件8.1、什么是中间件…...

MambaVision

核心速览 研究背景 研究问题 &#xff1a;这篇文章提出了一种新的混合Mamba-Transformer骨干网络&#xff0c;称为MambaVision&#xff0c;专为视 觉应用量身定制。研究的核心问题是如何有效地结合Mamba的状态空间模型&#xff08;SSM&#xff09;和Transf ormer的自注意力机制…...

MySQLDBA修炼之道-开发篇(二)

四、开发进阶 1. 范式和反范式 范式是数据库规范化的一个手段&#xff0c;是数据库设计中的一系列原理和技术&#xff0c;用于减少数据库中的数据冗余&#xff0c;并增进数据的一致性。 范式 1.1 第一范式 第一范式是指数据库表的每一列&#xff08;属性&#xff09;都是不可…...

前端必备的环境搭建

一、nvm安装详细教程&#xff08;安装nvm、node、npm、cnpm、yarn及环境变量配置&#xff09; 参考地址&#xff1a;nvm安装详细教程&#xff08;安装nvm、node、npm、cnpm、yarn及环境变量配置&#xff09;-CSDN博客 说明&#xff1a; 1&#xff09;关于nodejs目录不显示&a…...

SpringCloud笔记

什么是降级熔断&#xff1f;为什么要进行熔断&#xff1f; 熔断降级是一种分布式系统的保护机制&#xff0c;用于应对服务不稳定或不可用的情况。 熔断是指当某个服务的调用失败次数或异常比例达到一定阈值时&#xff0c;自动切断对该服务的调用&#xff0c;让请求快速失败&…...

优秀的程序员思考数据结构

原文地址&#xff1a;https://read.engineerscodex.com/p/good-programmers-worry-about-data 我最近在这篇很棒的 Stack Overflow 文章中看到了 Linus Torvalds&#xff08;Linux 和 Git 的创建者&#xff09;的一句话。&#xff08;这篇文章回顾了那篇文章中的许多引述。 它…...

「C/C++」C/C++标准库之#include<cstdlib>通用工具库

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…...

Oracle视频基础1.1.3练习

1.1.3 需求&#xff1a; 完整格式查看所有用户进程里的oracle后台进程 查看物理网卡&#xff0c;虚拟网卡的ip地址 ps -ef | grep oracle /sbin/ifconfig要以完整格式查看所有用户进程中的 Oracle 后台进程&#xff0c;并查看物理和虚拟网卡的 IP 地址&#xff0c;可以使用以下…...

python项目实战——多协程下载美女图片

协程 文章目录 协程协程的优劣势什么是IO密集型任务特点示例与 CPU 密集型任务的对比处理 I/O 密集型任务的方式总结 创建并使用协程asyncio模块 创建协程函数运行协程函数asyncio.run(main())aiohttp模块调用aiohttp模块步骤 aiofiles————协程异步函数遇到的问题一 await …...

基于.NET 8.0,C#中Microsoft.Office.Interop.Excel来操作office365的excel

开发环境&#xff1a; Visual Studio 2022 office365 项目模板&#xff1a;WPF应用程序 框架&#xff1a;.NET 8.0 依赖&#xff1a;Microsoft.Office.Interop.Excel 注意&#xff1a; 1.使用Microsoft.Office.Interop.Excel库时&#xff0c;服务器或电脑里面必须安装得…...

使用无线方式连接Android设备进行调试的两种方法

1.使用配对码配对设备方式 手机&#xff08;或者平板等安卓设备&#xff09;和电脑需连接在同一WiFi 下&#xff1b;保证 SDK 为最新版本&#xff08;adb --version ≥ 30.0.0&#xff09;&#xff1b; step1.手机启用开发者选项和无线调试模式&#xff08;会提示确认&#xff…...

Valgrind的使用

Valgrind 是一个强大的开源工具,用于检测程序中的内存错误、内存泄漏以及线程问题。它广泛应用于 C/C++ 等需要手动管理内存的编程语言中。以下内容将详细介绍 Valgrind 的安装、基本使用方法、常用命令及其输出结果的解析。 1. 什么是 Valgrind? Valgrind 是一个用于内存调…...

微信小程序瀑布流实现,瀑布流长度不均等解决方法

这是一开始实现的瀑布流&#xff0c;将数据分为奇数列和偶数列 <view class"content-left"><block wx:for"{{list}}" wx:key"list"><template isitem-data data{{...item}} wx:if"{{index % 2 0}}"></template&…...

Notepad++通过自定义语言实现日志按照不同级别高亮

借助Notepad的自定义语言可以实现日志的按照不同级别的高亮&#xff1b; 参考&#xff1a; https://blog.csdn.net/commshare/article/details/131208656 在此基础上做了一点修改效果如下&#xff1a; xml文件&#xff1a; <NotepadPlus><UserLang name"Ansibl…...

2024年四川省大学生程序设计竞赛 补题记录

文章目录 Problem A. 逆序对染色&#xff08;思维树状数组&#xff09;Problem B. 连接召唤&#xff08;贪心&#xff09;Problem E. L 型覆盖检查器&#xff08;模拟&#xff09;Problem F. 小球进洞&#xff1a;平面版&#xff08;几何&#xff09;Problem G. 函数查询Proble…...

17_事件的处理

目录 绑定事件与解绑事件优化事件的绑定和解绑方式处理不同事件类型的绑定处理同一事件类型多个事件处理函数事件冒泡与更新时机问题 绑定事件与解绑事件 既然要处理事件&#xff0c;那么首先面临的问题是如何在 vnode 中描述这个事件&#xff0c;在 vnode.props 中&#xff0…...

1FreeRTOS学习(队列、二值信号量、计数型信号量之间的相同点和不同点)

相同点&#xff1a; &#xff08;1&#xff09;传递区间 队列、二值信号量、计数型信号量均可用在任务与任务&#xff0c;任务与中断之间进行消息传递 &#xff08;2&#xff09; 传递方式 创建队列--发送队列--接受队列 创建二值信号量--发送二值信号量--接受二值信号量 创建计…...

数据库设计与范式及其应用

数据库设计是数据库管理系统&#xff08;DBMS&#xff09;中的核心环节&#xff0c;良好的数据库设计不仅可以提高数据存取的效率&#xff0c;还能增强数据的可维护性和一致性。范式&#xff08;Normalization&#xff09;是一种设计原则&#xff0c;用于减少数据冗余和提高数据…...

笔记-配置PyTorch(CUDA 12.2)

文章目录 前言一、安装 PyTorch&#xff08;CUDA 12.2&#xff09;1. 创建并激活 Conda 环境2. 安装 PyTorch&#xff08;CUDA 12.2&#xff09;3. 安装 torch_geometric 及依赖项4. 验证安装 总结 前言 一、安装 PyTorch&#xff08;CUDA 12.2&#xff09; 1. 创建并激活 Con…...

[C++]——红黑树(附源码)

目录 一、前言 二、正文 2.1 红黑树的概念 2.2 红黑树的性质 2.3红黑树节点的定义 2.4 红黑树的插入 2.4.1 情况一 2.4.2 情况二 ​编辑 2.4.3 情况三 2.5 红黑树的验证 三、全部代码 四、结语 一、前言 在上一篇博客中&#xff0c;为小伙伴们进行了AVL树的讲解&#…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...