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

Node.js——body-parser、防盗链、路由模块化、express-generator应用生成器

个人简介

👀个人主页: 前端杂货铺
🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展
📃个人状态: 研发工程师,现效力于中国工业软件事业
🚀人生格言: 积跬步至千里,积小流成江海
🥇推荐学习:🍍前端面试宝典 🎨100个小功能 🍉Vue2 🍋Vue3 🍓Vue2/3项目实战 🥝Node.js实战 🍒Three.js

🌕个人推广:每篇文章最下方都有加入方式,旨在交流学习&资源分享,快加入进来吧

内容参考链接
Node.js(一)Node.js——fs(文件系统)模块
Node.js(二)Node.js——path(路径操作)模块
Node.js(三)Node.js——http 模块(一)
Node.js(四)Node.js——http 模块(二)
Node.js(五)Node.js——express项目搭建、请求、响应
Node.js(六)Node.js——express中间件(全局中间件、路由中间件、静态资源中间件)

文章目录

    • 前言
    • 获取请求体数据
    • 防盗链
      • Referer 头验证
      • 使用 CORS 跨域
      • 使用自定义 HTTP 头
    • 路由模块化
    • Express 应用程序生成器
    • 总结

前言

上篇文章我们认识了中间件的使用及作用。

本篇文章我们学习如何获取请求体数据、防盗链的使用。


获取请求体数据

express 可以使用 body-parser 包处理请求体;它支持多种格式的数据解析,包括JSON、URL编码和文件上传处理。

安装 body-parser 包

npm i body-parser

导入 body-parser 包

const bodyParser = require('body-parser');

获取中间件函数:

const urlParser = bodyParser.urlencoded({extend: false});
const jsonParser = bodyParser.json();

下面,我们设置路由中间件,然后使用 req.body 来获取请求体数据。

const bodyParser = require("body-parser");
const express = require("express");const app = express();// 解析 json 格式的请求体的中间件
const jsonParser = bodyParser.json();
// 解析 querystring 格式请求体的中间件
const urlencodeParser = bodyParser.urlencoded({ extended: false });app.get("/login", (req, res) => {res.sendFile(__dirname + "/index.html");
});// urlencodeParser 执行完毕之后,会往 req 中添加一个 body
app.post("/login", urlencodeParser, (req, res) => {console.log(req.body);res.send("获取用户的数据");
});app.listen(3000, () => {console.log("服务已启动,端口 3000 正在监听中...");
});

index.html 中的内容如下,发送 post 请求(PS:也可以使用 postman 等第三方工具发)。

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><body><form action="/login" method="post">用户名:<input type="text" name="username" /><br />密码:<input type="text" name="password" /><br /><button>登录</button></form></body>
</html>

在这里插入图片描述

在这里插入图片描述


防盗链

在 Node.js 环境中,防止资源被直接访问(即防盗链)通常涉及到几个关键方面,包括设置HTTP响应头、使用服务器端的访问控制以及可能的客户端验证。

Referer 头验证

在服务器端,检查请求的 Referer 头来验证请求是否来自你的网站。这种方法依赖于客户端正确设置 Referer 头,但这不是100%可靠的,因为用户可以禁用 Referer 头。

const express = require("express");const app = express();app.use((req, res, next) => {let referer = req.get("referer");if (referer) {const url = new URL(referer);const hostname = url.hostname;if (hostname !== "127.0.0.1") {res.status(404).send("Not Found");return;}}next();
});app.use(express.static(__dirname + "/public"));app.listen(3000, () => {console.log("服务已启动,端口 3000 正在监听中...");
});

public/index.html 中添加如下代码:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><body><p>http://localhost:3000/ => 不显示svg图片</p><p>http://127.0.0.1:3000/ => 显示svg图片</p><img src="http://localhost:3000/images/star.svg" alt="" /></body>
</html>

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


使用 CORS 跨域

使用 CORS 跨域间接帮助防止资源被未授权的网站访问。

const cors = require('cors');
const app = express();app.use(cors({origin: 'https://yourdomain.com' // 只允许来自此域的请求
}));

使用自定义 HTTP 头

通过设置 X-Frame-Options 头,你可以防止资源被嵌入到其他网站中,这是一种间接的防盗链方法。

app.use((req, res, next) => {res.setHeader('X-Frame-Options', 'SAMEORIGIN'); // 或 'DENY' 来完全禁止嵌入next();
});

路由模块化

实际开发中,路由会有很多种(比如前台路由、后台路由等),我们可以把路由模块化,这样更易于维护、代码也更清晰。

创建 homeRouter.js 文件,用于存放前台路由。

const express = require("express");// 创建路由对象
const router = express.Router();router.get("/home", (req, res) => {res.send("前台首页");
});router.get("/search", (req, res) => {res.send("内容搜索");
});module.exports = router;

创建 adminRouter.js 文件,用于存放后台路由。

const express = require("express");// 创建路由对象
const router = express.Router();router.get("/admin", (req, res) => {res.send("后台首页");
});router.get("/setting", (req, res) => {res.send("后台设置");
});module.exports = router;

在主文件中,引入前台路由和后台路由,并通过 app.use() 使用它们。

const express = require("express");
const homeRouter = require("./routes/homeRouter");
const adminRouter = require("./routes/adminRouter");const app = express();
// 前台路由
app.use(homeRouter);
// 后台路由
app.use(adminRouter);router.get("*", (req, res) => {res.send("Not Found");
});app.listen(3000, () => {console.log("服务已启动,端口 3000 正在监听中...");
});

在这里插入图片描述

在这里插入图片描述


Express 应用程序生成器

通过应用生成器能快速创建一个应用骨架。

安装 express-generator

npm i express-generator

创建名为 express-generator 的应用程序。

experss -e express-generator

之后再 npm i 安装一下依赖,即可得到如下的目录结构。

在这里插入图片描述

终端键入命令 npm start 即可运行应用。

在这里插入图片描述


总结

本篇文章我们学习了 使用 body-parser 获取请求体数据、使用 referer 头验证等方式添加防盗链、拆分路由实现其模块化,使用 express-generator 快速搭建应用等。

好啦,本篇文章到这里就要和大家说再见啦,祝你这篇文章阅读愉快,你下篇文章的阅读愉快留着我下篇文章再祝!


参考资料:

  1. Node.js教程(菜鸟教程)
  2. Node.js零基础视频教程(尚硅谷 · 李强)

在这里插入图片描述


相关文章:

Node.js——body-parser、防盗链、路由模块化、express-generator应用生成器

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…...

22.Word:小张-经费联审核结算单❗【16】

目录 NO1.2 NO3.4​ NO5.6.7 NO8邮件合并 MS搜狗输入法 NO1.2 用ms打开文件&#xff0c;而不是wps❗不然后面都没分布局→页面设置→页面大小→页面方向→上下左右&#xff1a;页边距→页码范围&#xff1a;多页&#xff1a;拼页光标处于→布局→分隔符&#xff1a;分节符…...

Agent 高频知识汇总:查漏补缺参考大全

Agent 高频问题汇总 一、基础概念类 &#xff08;一&#xff09;请解释 Agent 的概念及其主要特点 Agent 是一种能够感知所处环境&#xff0c;并基于感知信息做出决策、采取行动以实现特定目标的实体。它既可以是简单的规则基系统&#xff0c;也能是复杂的智能体&#xff0c…...

本地化部署DeepSeek-R1

本文环境搭建均基于免费工具&#xff0c;感谢开源。 一、下载工具并安装 1. Ollama&#xff1a;最新版本 0.5.7 官网在这里 https://ollama.com/download 但是下载太慢&#xff0c;得换个思路 https://sourceforge.net/projects/ollama.mirror/ 2.Chatbox https://cha…...

验证二叉搜索数(98)

98. 验证二叉搜索树 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* …...

StarRocks BE源码编译、CLion高亮跳转方法

阅读SR BE源码时&#xff0c;很多类的引用位置爆红找不到&#xff0c;或无法跳转过去&#xff0c;而自己的Linux机器往往缺乏各种C依赖库&#xff0c;配置安装比较麻烦&#xff0c;因此总体的思路是通过CLion远程连接SR社区已经安装完各种依赖库的Docker容器&#xff0c;进行编…...

数模测评:doubao1.5>deepseek-v3>gpt-o1

本次测试了当前评价最高的三款大模型doubao1.5、gpt-o1、deepseek-v3(r1崩溃)&#xff0c;都是采用无提示词的硬核提问方式&#xff0c;测试视频如下。 gpto1、doubao1.5、deepseek测评 测试方式&#xff1a; 上传美赛六道题目文件 直接提问以下5句话&#xff1a; 这是一道数学…...

晴,初三,年已过

既然直播如此影响情绪&#xff0c;为什么还要直播&#xff1f;因为无聊&#xff1f;明明那么多事情可以打发时间。 真不想懂。 今日初三&#xff0c;昨天晚上小舅家聚&#xff0c;今天大舅家聚&#xff0c;计划明天小姨妈家聚。 今晚喝了点大舅哥哥泡的白葡萄酒&#xff0c;…...

Vue3 v-bind 和 v-model 对比

1. 基本概念 1.1 v-bind 单向数据绑定从父组件向子组件传递数据简写形式为 : 1.2 v-model 双向数据绑定父子组件数据同步本质是 v-bind 和 v-on 的语法糖 2. 基础用法对比 2.1 表单元素绑定 <!-- v-bind 示例 --> <template><input :value"text&quo…...

Smalltalk语言是何物?面向对象鼻祖Simula的诞生?Simula和Smalltalk有什么区别?面向对象设计?

Smalltalk语言是何物? Smalltalk语言的前身可以追溯到Flex系统&#xff0c;这是由Alan Kay最早提出的。在随后的发展中&#xff0c;Smalltalk逐渐演化&#xff0c;并出现了Smalltalk-72和Smalltalk-76等版本。最终&#xff0c;在经过近10年的研究与发展后&#xff0c;Xerox研究…...

KVM/ARM——基于ARM虚拟化扩展的VMM

1. 前言 ARM架构为了支持虚拟化做了些扩展&#xff0c;称为虚拟化扩展(Virtualization Extensions)。原先为VT-x创建的KVM(Linux-based Kernel Virtual Machine)适配了ARM体系结构&#xff0c;引入了KVM/ARM (the Linux ARM hypervisor)。KVM/ARM没有在hypervisor中引入复杂的…...

Windows系统中Docker可视化工具对比分析,Docker Desktop,Portainer,Rancher

Docker可视化工具对比分析&#xff0c;Docker Desktop&#xff0c;Portainer&#xff0c;Rancher Windows系统中Docker可视化工具对比分析1. 工具概览2. Docker Desktop官网链接&#xff1a;主要优点&#xff1a;主要缺点&#xff1a;版本更新频率&#xff1a; 3. Portainer官网…...

【架构面试】二、消息队列和MySQL和Redis

MQ MQ消息中间件 问题引出与MQ作用 常见面试问题&#xff1a;面试官常针对项目中使用MQ技术的候选人提问&#xff0c;如如何确保消息不丢失&#xff0c;该问题可考察候选人技术能力。MQ应用场景及作用&#xff1a;以京东系统下单扣减京豆为例&#xff0c;MQ用于交易服和京豆服…...

算法【完全背包】

完全背包与01背包的区别仅在于每种商品可以选取无限次。时间复杂度O(物品数量 * 背包容量) 下面通过题目加深理解。 题目一 测试链接&#xff1a;疯狂的采药 - 洛谷 分析&#xff1a;这是一道完全背包的模板题。对于第i个物品的可能性展开也有两种&#xff0c;第一种是不取第…...

二叉树的遍历

有一个结点的二叉树。给出每个结点的两个子结点编号&#xff0c;建立一棵二叉树&#xff0c;如果是叶子结点&#xff0c;则输入 0 0。 建好树这棵二叉树之后&#xff0c;依次求出它的前序、中序、后序列遍历。 输入格式: 第一行一个整数n &#xff0c;表示结点数。 之后n 行…...

1.31 实现五个线程的同步

1.使用互斥锁实现 1>程序代码 #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <pthread.h> #include &l…...

three.js+WebGL踩坑经验合集(6.1):负缩放,负定矩阵和行列式的关系(2D版本)

春节忙完一轮&#xff0c;总算可以继续来写博客了。希望在春节假期结束之前能多更新几篇。 这一篇会偏理论多一点。笔者本没打算在这一系列里面重点讲理论&#xff0c;所以像相机矩阵推导这种网上已经很多优质文章的内容&#xff0c;笔者就一笔带过。 然而关于负缩放&#xf…...

【开源免费】基于SpringBoot+Vue.JS体育馆管理系统(JAVA毕业设计)

本文项目编号 T 165 &#xff0c;文末自助获取源码 \color{red}{T165&#xff0c;文末自助获取源码} T165&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...

《大数据时代“快刀”:Flink实时数据处理框架优势全解析》

在数字化浪潮中&#xff0c;数据呈爆发式增长&#xff0c;实时数据处理的重要性愈发凸显。从金融交易的实时风险监控&#xff0c;到电商平台的用户行为分析&#xff0c;各行业都急需能快速处理海量数据的工具。Flink作为一款开源的分布式流处理框架&#xff0c;在这一领域崭露头…...

antdesignvue统计数据源条数、计算某列合计值、小数计算不精确多了很多小数位

1.在</a-table>下方加如下代码 <div>数据总条数&#xff1a;{ {tableData.length}}&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp <template>A列合计&#xff1a;{ {sum}}</template> </div> 注&#xff1a;tableData为<a-tabl…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...