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

news2024/10/28 19:47:12

文章目录

        • 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 = 404
        res.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 = 404
    res.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 } = req
    fs.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.query
    if (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.body
	res.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
    // 获取referer
    let referer = req.get('referer')
    if (referer) {
        // 序列化referer
        let url = new URL(referer)
        let hostname = url.hostname
        console.log(hostname)
        if (hostname !== '127.0.0.1') {
            // 响应404
            res.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)

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

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

相关文章

轻松部署自己的AI聊天助手LocalGPT并实现无公网IP远程交互

文章目录 前言环境准备1. localGPT部署2. 启动和使用3. 安装cpolar 内网穿透4. 创建公网地址5. 公网地址访问6. 固定公网地址 前言 本文主要介绍如何本地部署LocalGPT并实现远程访问&#xff0c;由于localGPT只能通过本地局域网IP地址端口号的形式访问&#xff0c;实现远程访问…

雷池社区版中升级雷池遇到问题

关于升级后兼容问题 版本差距过大会可能会发生升级后数据不兼容导致服务器无法起来 跨多个版本&#xff08;超过1个大版本号&#xff09;升级做好数据备份&#xff0c;遇到升级失败可尝试重新安装解决 升级提示目录不对 在错误的目录下执行&#xff08;比如 safeline 的子目…

【WRF数据准备】基于GEE下载静态地理数据-叶面积指数LAI及绿色植被率Fpar

【WRF数据准备】基于GEE下载静态地理数据 准备:WRF所需静态地理数据(Static geographical data)数据范围说明基于GEE下载叶面积指数及绿色植被率GEE数据集介绍数据下载:LAI(叶面积指数)和Fpar(绿色植被率)数据处理:基于Python处理为单波段LAI数据参考GEE的介绍可参见另…

分布式理论基础

文章目录 1、理论基础2、CAP定理1_一致性2_可用性3_分区容错性4_总结 3、BASE理论1_Basically Available&#xff08;基本可用&#xff09;2_Soft State&#xff08;软状态&#xff09;3_Eventually Consistent&#xff08;最终一致性&#xff09;4_总结 1、理论基础 在计算机…

技术周总结 10.21~10.27周日

文章目录 一、10.24 周四 程序员节2.1&#xff09;问题01&#xff1a; Memory Analysis Tool的使用方法 二、10.27 周日2.1&#xff09; J2EE架构J2EE 的核心组件与技术J2EE 的多层架构J2EE 的优缺点J2EE 的应用场景 2.2&#xff09;web应用开发中的 "web服务器" 和 …

AGI 之 【Dify】 之 Dify 在 Windows 端本地部署调用 Ollama 本地下载的大模型,实现 API 形式进行聊天对话

AGI 之 【Dify】 之 Dify 在 Windows 端本地部署调用 Ollama 本地下载的大模型&#xff0c;实现 API 形式进行聊天对话 目录 AGI 之 【Dify】 之 Dify 在 Windows 端本地部署调用 Ollama 本地下载的大模型&#xff0c;实现 API 形式进行聊天对话 一、简单介绍 二、创建一个聊…

ReactNative TurboModule(3)

ReactNative TurboModule 简述 ReactNative新架构的两个核心支柱是TurboModule和Fabric渲染器&#xff0c;前者的功能是提供一个Native的模块&#xff0c;比如蓝牙之类的&#xff0c;后者则是提供一个自定义Native UI组件的能力&#xff0c;ReactNative本身虽然提供了非常多的…

Python 中 {} 是 set 还是 dict

先说结论&#xff1a; {} 是 dict 字典。 一、描述 在 Python 中&#xff0c;我们可以用如下&#xff0c;表示一个集合 set my_set {1, 2, 3, 4, 5, 6} 也可以用如下&#xff0c;表示一个字典 dict my_dict {1:10, 2:20, 3:30, 4:40} 不管是集合还是字典&#xff0c;都…

【Ubuntu20.04 Visual Studio Code安装】【VSCODE】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、打开VSCOE官网二、下载VSODE的Ubuntu版本三、安装VSCODE软件包四、导入工作空间(添加工作空间目录)五、安装插件&#xff1a;1.安装简体中文包2.安装ros插件…

NSSCTF刷题篇web部分

源码泄露 [FSCTF 2023]寻找蛛丝马迹 这个源码泄露&#xff0c;可以记录一下&#xff0c;涉及的知识点比较多 打开环境 查看源码&#xff0c; 第一段flag 乱码&#xff0c;恢复一下 乱码恢复网站&#xff1a;乱码恢复 (mytju.com) 剩下的就只说方法 http://node4.anna.nss…

python实现放烟花效果庆祝元旦

马上就要2025年元旦啦&#xff0c;提前祝大家新年快乐 完整代码下载地址&#xff1a;https://download.csdn.net/download/ture_mydream/89926458

uaGate SI——实现OT与IT的安全连接

对于许多制造商来说&#xff0c;诸如工业物联网&#xff08;IIoT&#xff09;、信息物理系统&#xff08;CPS&#xff09;和大数据等概念已经开始与其智能工厂的愿景紧密相连。智能工厂是将信息技术&#xff08;IT&#xff09;的数字世界与运营技术&#xff08;OT&#xff09;的…

H5的Canvas绘图——使用fabricjs绘制一个可多选的随机9宫格

&#x1f4e2;欢迎点赞 &#xff1a;&#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff0c;赐人玫瑰&#xff0c;手留余香&#xff01;&#x1f4e2;本文作者&#xff1a;由webmote 原创&#x1f4e2;作者格言&#xff1a;新的征程&#xff0c;最近一直被测试…

node升级package.json中的版本

由于项目使用时间过老&#xff0c;升级对应包版本&#xff0c;可以使用新功能 1.使用npm-check-updates这个工具&#xff0c;先全局安装 npm install -g npm-check-updates2.检查package.json中dependencies的最新版本 ncu3.更新dependencies到新版本 ncu -u也是一样的 npx…

微知SOP-定位Linux crash问题的几个常用方面和常用命令?

文章目录 1 背景2 问题描述和SOP2.1 进入目录2.2 安装crasn和vmlinux2.3 使用crash命令进入debug目录2.4 收集主要信息2.5 收集task关键信息2.6 查看堆栈信息2.7 使用反汇编查看crash所在行2.8 根据寄存器获取一些关键数据2.9 根据堆栈获取信息2.10 加载内核模块2.11 收集其他t…

宿舍管理新篇章:基于Spring Boot的系统开发

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

零基础学linux文件管理

目录 引言 基础知识 回顾C语言 fopen fclose 更改进程路径&#xff1a;chdir fwrite可以用来写入 sizeof字符串 C语言默认打开三个输入输出流 过渡到系统 系统调用&#xff1a;open “位字段”或“位掩码” open的使用 关闭文件&#xff1a;close 写入&#xff1…

【C++】继承与模板

继承 1.继承的概念 概念&#xff1a;继承(inheritace)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称之为派生类。继承呈现了面向对象程序设计的…

AI创作者与人类创作者的协作模式

公主请阅 1. AI创作者的崛起1.1 AI创作者的工作原理1.2 AI创作者的优势 2. 人类创作者的独特价值2.1 创造性与情感2.2 伦理与价值观2.3 文化与背景 3. AI与人类的协作模式3.1 协同创作3.2 内容编辑3.3 数据驱动的创作3.4 跨媒体协作 4. AI与人类协作的挑战4.1 技术局限性4.2 版…

Linux学习笔记 | sudo命令的基本使用

sudo命令 sudo 命令是 Unix 和 Linux 系统中用于执行需要超级用户权限&#xff08;即 root 权限&#xff09;操作的工具。它允许系统管理员授予某些用户&#xff08;或用户组&#xff09;以 root 或其他指定用户的权限来运行特定命令&#xff0c;而无需知道 root 用户的密码。…