【Express】常用中间件用法:会话管理、输入验证(文章附有完整代码示范)

Express框架入门:从基础搭建到路由与中间件实践 Express作为Node.js生态中最流行的Web框架,通过中间件机制简化了HTTP服务器开发流程。其核心原理是基于请求-响应循环,通过串联中间件函数处理HTTP请求。在工程实践中,Express的路由系统支持RESTful API设计,而中间件架构则实现了功能模块的灵活组合。常见应用场景包括构建Web应用后台、开发API服务以及快速原型验证。本文以Express环境搭建为切入点,详细解析了服务器创建、路由定义、请求处理等核心功能,特别介绍了body-parser和multer等常用中间件在处理JSON数 阅读详情

前言

Express 是一个简洁而强大的 Node.js Web 应用框架,它提供了丰富的中间件来帮助开发者快速构建 Web 应用。

前面我写的express专栏中很少涉及express中间件的用法,因此现在补充一些常用的中间件。

express专栏-从入门到进阶

本篇文章我们将深入探讨 Express 的两个重要知识点:express-session、express-validator,并展示如何将它们有效地结合起来,以构建一个功能更强大、更安全的 Express 应用。

准备工作

创建和初始化express项目(创建和初始化操作可以看专栏文章)

一、express-session:会话管理

express-session 是一个用于管理会话的中间件,它允许你在不同的请求之间存储和访问用户的会话数据。在用户登录、购物车管理等场景中非常有用。 

安装

npm install express-session

代码示例

在 app.js 中添加以下代码:

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');

const session = require('express-session');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');



app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

// 配置 session
app.use(session({
  secret: 'kainama',
  resave: false,
  saveUninitialized: true,
  cookie: { secure: false } // 在生产环境中,建议设置为 true
}));

// 示例路由,设置和获取会话数据
app.get('/set-session', (req, res) => {
  req.session.username = 'JohnDoe';
  res.send('Session set successfully');
});

app.get('/get-session', (req, res) => {
  const username = req.session.username;
  if (username) {
      res.send(`Welcome, ${username}`);
  } else {
      res.send('No session data found');
  }
});

app.use('/', indexRouter);
app.use('/users', usersRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

测试

使用api测试工具,发送get请求 (设置会话数据)

 发送get请求(获取会话数据)

在上述代码中,我们首先引入了 express-session 并进行了配置。然后创建了两个路由,一个用于设置会话数据,另一个用于获取会话数据。

PS:一定要注意发送顺序,比如你后发送设置会话数据,而先进行获取会话数据,那么肯定是获取不到username的值。

二、express-validator:输入验证

express-validator 是一个用于验证和清理用户输入的中间件,它可以帮助你防止恶意输入和数据损坏。

安装

npm install express-validator

代码示例

在 app.js 中添加以下代码:

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');

const { check, validationResult } = require('express-validator');
var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');



app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));


// 示例路由,验证用户输入
app.post('/validate', [
  check('email').isEmail().withMessage('Invalid email'),
  check('password').isLength({ min: 6 }).withMessage('Password must be at least 6 characters')
], (req, res) => {
  const errors = validationResult(req);
  if (!errors.isEmpty()) {
      return res.status(400).json({ errors: errors.array() });
  }
  res.send('Input validated successfully');
});
app.use('/', indexRouter);
app.use('/users', usersRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

 比如这里我们设置是对email和password进行了数据验证

  • email:需要满足邮箱格式
  • password:不小于6位

  代码语句分析

check('email').isEmail().withMessage('Invalid email')

1. check('email')

  • check 是 express-validator 库提供的一个函数,它的作用是指定要验证的字段。
  • 'email' 是要验证的字段名,通常是表单中的一个输入字段名或者请求体中的一个属性名。在处理 HTTP 请求时,check 函数会从请求体、查询字符串、URL 参数等位置查找名为 email 的字段。

2. .isEmail()

  • 这是一个验证器方法,它是 check 函数返回的验证对象的一个方法。
  • isEmail() 用于验证 email 字段的值是否符合电子邮件地址的格式。它会检查输入是否包含有效的用户名、域名和顶级域名,例如 user@example.com 是有效的,而 userexample.com 是无效的。

3. .withMessage('Invalid email')

  • withMessage 方法用于为验证失败的情况提供自定义的错误消息。
  • 当 isEmail() 验证失败时,会生成一个包含错误信息的对象,这个错误信息就是 'Invalid email'。在后续处理验证结果时,可以使用这个错误信息来给用户反馈具体的错误原因。

 测试

错误的email格式

返回的结果

错误的密码格式 

返回的结果 

 email和密码均不符合验证

 

正确的验证格式

三、结合使用的案例

创建一个简单的用户登录系统。在这个系统中,用户需要输入有效的电子邮件和密码进行登录,登录成功后会将用户信息存储在会话中,后续可以通过会话检查用户是否已登录。

代码示范

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');

const session = require('express-session');
const { check, validationResult } = require('express-validator');
var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');



app.use(logger('dev'));
app.use(express.json());
// app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

// 配置 session
app.use(session({
  secret: 'kainama',
  resave: false,
  saveUninitialized: true,
  cookie: { secure: false } // 在生产环境中,建议设置为 true
}));

// 解析表单数据
app.use(express.urlencoded({ extended: true }));

// 模拟用户数据库
const users = [
  { email: 'test@qq.com', password: 'root123' }
];

// 登录页面
app.get('/login', (req, res) => {
  res.send(`
      <form method="post" action="/login">
          <label for="email">Email:</label>
          <input type="email" id="email" name="email" required><br>
          <label for="password">Password:</label>
          <input type="password" id="password" name="password" required><br>
          <button type="submit">Login</button>
      </form>
  `);
});
// 处理登录请求
app.post('/login', [
  // 验证电子邮件
  check('email')
     .isEmail()
     .withMessage('Please enter a valid email address'),
  // 验证密码长度
  check('password')
     .isLength({ min: 6 })
     .withMessage('Password must be at least 6 characters long')
], (req, res) => {
  const errors = validationResult(req);
  if (!errors.isEmpty()) {
      return res.status(400).json({ errors: errors.array() });
  }

  const { email, password } = req.body;
  const user = users.find(u => u.email === email && u.password === password);

  if (user) {
      // 登录成功,将用户信息存储在会话中
      req.session.user = user;
      res.send('Login successful!');
  } else {
      res.status(401).send('Invalid email or password');
  }
});
// 受保护的路由,需要登录才能访问
app.get('/dashboard', (req, res) => {
  const user = req.session.user;
  if (user) {
      res.send(`Welcome to the dashboard, ${user.email}!`);
  } else {
      res.status(401).send('Please log in to access this page');
  }
});

// 注销路由
app.get('/logout', (req, res) => {
  req.session.destroy((err) => {
      if (err) {
          console.error(err);
      }
      res.send('Logged out successfully');
  });
});

app.use('/', indexRouter);
app.use('/users', usersRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

 启动服务,访问http://localhost:3000/login

测试

使用测试的账号密码

 

 访问受保护的路由

 

大家可以自行测试登录失败、未登录前访问受保护路由的情况。 

四、小结

 通过结合使用 express-session、express-validator ,我们可以构建一个功能更强大、更安全的 Express 应用。express-session 帮助我们管理用户会话,express-validator 确保用户输入的有效性。这些中间件的组合可以大大提高开发效率和应用的安全性。

express-validator入门 1.简介 express-validator是一组express.js中间件,其中包装了validateator.js验证器和消毒器功能。 2.安装 使用npm安装它(确保您具有Node.js 8或更高版本): npm install --save express-validator 3.基础指南 让我们开始写一条基本的路线来在数据库中创建用户: const express = require('express'); const app = expr... 阅读详情

相关推荐

【Express】常用中间件用法:会话管理、输入验证(文章附有代码示范)

前面我写的express专栏中很少涉及express中间件的用法,因此现在补充一些常用的中间件。并展示如何将它们有效地结合起来,以构建一个功能更强大、更安全的 Express 应用。

科技改变世界,技术驱动未来。 1678

Express Session 的基本使用

一、 Session 简单介绍 session 是另一种记录客户状态的机制,不同的是 Cookie 保存在客户端浏览器中,而 session 保存在服务器上。 Cookie 数据存放在客户的浏览器上,Session 数据放在服务器上。Session 相比 Cookie 要 更安全一些。由于 Session 保存到服务器上,所以当访问量增多的时候,会比较占用服务器 的性能。单个 cookie 保存的数据大小不能超过 4K,很多浏览器都限制一个站点最多保存 20 个 cookie。Session 没有这方面

zep 5940

框架设计原理与实战:Express.js框架下的中间件设计

1.背景介绍 Express.js是一个基于Node.js的Web应用开发框架。它提供了一系列功能强大的API接口,允许用户快速构建HTTP服务端程序。其中一个重要的特性就是其丰富的中间件机制,使得开发者可以方便地对请求进行拦截、处理或转发等操作,从而实现更多高级的业务逻辑。本文将会通过Express.js框架下中间件的设计原理和实践方法来详细阐述中间

AI天才研究院 235

express 实现session

1) session工作过程 1)用户登录后 把sessionID保存到Cookie中 2)用户在请求网站别的服务器的时候 由浏览器请求带上cookie发送到服务器 3)服务器拿到sessionID后 通过该ID 找到保存在服务器的用户信息 4)拿到用户信息进行处理 2)express-session 配置参数 name -cookie的名字 store -session 存储实例 ...

时意 1945

Node.js Express 实现用户认证与会话管理

本文深入探讨了使用Node.js和Express框架实现用户认证与会话管理的过程。介绍了用户注册表单的创建、密码加密存储以及登录验证机制。此外,详细阐述了Express会话的实现,包括如何设置和使用express-session中间件来维护用户状态。最后,讲述了如何通过自定义中间件保护页面,以及如何在用户已登录时防止访问注册和登录页面。

weixin_35995661的博客 363

超详细MySQL 8.0安装与配置

MySQL的安装与配置 还不会安装MySQL的同学们,还不会配置MySQL的同学们,赶紧按照下面步骤操作起来,超详细安装步骤如下: 进入MySQL官网 1、点击download 2、点击MySQL Community Server 3、选好选项点击go to download page 4、点击download 5、点击no thanks,just start my download 6、选Server only,点击Next 7、点击Execute 8、点击

Turniper的博客 8751

Node学习(九)064-会话技术简介之session的设置和获取——设置与获取之express-session模块& session有效期& 删除session& cookie和session的原理

session

weixin_44867717的博客 1185

开源数显表

开源数显表,广泛应用于车床、铣床、磨床、镗床、火花机、线切割等。市面上此类液晶数显表多数都是基于此项目。 一、基本配置 硬件 主控:STM32F407VGT6 LCD:群创AT070TN92 显示驱动:RA8875 光栅尺:3 x 输入(X/Y/Z) 串口:1 x MAX3232 继电器:2 x 输出 存储:AT24C64 模拟输入:LM324C 电源:AC 220V 软件 工程版本:Keil 5 STM32库:V1.4.0 图形界面:uCGUI 多语言支持:中文、英文 二、项目文

m0_70934529的博客 435

解决Express内存泄漏:从检测到预防的完整指南

你是否遇到过Express应用运行越久响应越慢,最终因内存耗尽崩溃的情况?本文将通过实际案例和工具演示,帮你掌握内存泄漏检测、分析和预防的全流程,让Node.js服务稳定运行。 ## 内存泄漏的常见陷阱 Express应用中最容易引发内存泄漏的场景包括: - **未清理的闭包引用**:如长期缓存未释放的中间件状态 - **全局变量累积**:频繁向`global`对象添加属性而不清理 - **...

gitblog_00893的博客 849

手把手教你配置SAP PP供应区域(Supply Area):实现线边仓精准发料与物料流优化

本文详细解析了SAP PP供应区域(Supply Area)的配置方法,帮助企业实现线边仓精准发料与物料流优化。通过三级优先级逻辑和四步配置法,系统可自动识别最优组件来源位置,显著提升生产订单处理效率和库存准确率。文章还提供了典型问题解决方案和性能优化技巧,适用于离散制造和重复制造场景。

weixin_29275257的博客 431

基于Python的信用卡欺诈检测机器学习案例报告

当今时代,在线支付已成为一种高效便捷的支付方式,我们可以突破时间和空间的限制,输入我们的信用卡各项信息就可以完成在线支付。但随之而来的是这种支付方式也具备一定的风险性,我们无法辨别对方是否是恶意套取我们资金的非法分子。当信用卡信息数据泄露导致金钱失窃并最终失去客户忠诚度和公司声誉时,组织、消费者、银行和商家都会面临风险。2017 年,未经授权的信用卡操作达到了惊人的 1670 万受害者。此外,据美国联邦贸易委员会 (FTC) 报告,2017 年信用卡欺诈索赔数量比上一年高出 40%。

weixin_45673389的博客 6689

Agent Express:用中间件思维构建可组合的AI智能体

中间件是Web开发中处理请求-响应生命周期的核心抽象,它通过洋葱模型将认证、日志、数据解析等功能解耦为可插拔的模块。这一模式的价值在于其强大的组合性与关注点分离能力,能显著提升复杂系统的可维护性和可测试性。在AI智能体开发领域,模型调用、工具执行、记忆管理、预算控制等横切关注点同样面临组合难题。Agent Express框架创新性地将中间件范式引入智能体架构,将智能体生命周期 that 解构为统一的`(ctx, next)`函数,使得预算守卫、自动重试、用量统计等功能都能通过声明式的`agent.use()

weixin_30414305的博客 692

百度文心大模型ERNIE全面解析

文章摘要:本文汇总了多个Python自然语言处理(NLP)工具库的应用实例,涵盖百度文心大模型ERNIE、Hugging Face Transformers、StanfordNLP、SymSpell等主流框架。内容涉及文本预处理、情感分析、命名实体识别、机器翻译、文本纠错等典型NLP任务,并包含ERNIE-Lite、BART、T5等模型的调用示例。各工具库的特色功能包括:ERNIE的知识增强技术、Transformers的多任务统一接口、SymSpell的高效拼写纠正等。文章还提供了知识图谱构建、Rasa对

keny-大成的博客 2524

express 使用cookie-session 中间件判断用户的状态

cookie-session 用户和服务器通过发送http请求进行交互,而http是一个无状态协议,也就是说这一次请求和上一次的请求之间是没有任何关系的。为了让服务器知道是同一个用户端发送的请求,我们可以通过浏览器保存一些信息,每次发送请求的时候都带到服务器端,服务端根据这些信息来判断是不是同一个用户进行的访问。 服务器给浏览器只种cookie,使用cookie-parser中间件。 服务器给浏览...

蒲公英芽的博客 1365

SE80 Repository Information System 在 SAP CRM WebClient UI 组件分析中的实战指南

在 SAP CRM WebClient UI 开发过程中,如何快速定位组件、视图、上下文节点以及各类运行时对象,一直是调试效率的关键。(后文简称RIS)正是隐藏在SE80里的瑞士军刀,帮助开发者按照组件集、数据元素、上下文节点属性等多维条件进行交叉检索。官方博客将它描述为本文结合多年项目经验,系统梳理RIS的功能脉络与实战技巧,同时引入真实案例,示范如何借助它在几分钟内完成以往动辄数小时的排查任务。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2万+

使用MATLAB进行灰色预测 GM(1,1)

使用MATLAB进行灰色预测 GM(1,1)

Hou_____的博客 997

DeepWiki-Open 环境变量 5 步就位:从 .env 到 Wiki 跑通

第一次跑 DeepWiki-Open,最容易卡住的环节是环境变量配置。DeepWiki-Open 是面向开源仓库的 AI 驱动 Wiki 生成工具,环境变量配置到位后,输入仓库地址,界面会自动产出章节化文档、交互式代码地图和可追问的流式解答。下文按"最小变量集 → 立即验证 → 按提供商切换 → 与 JSON 配置联动"的顺序展开,目标是前后端一次启动成功。 ## 初见效果:配置成功后的三件套

gitblog_00430的博客 609

matlab 点云学习目录【2026最新版】

matlab 点云学习目录。博客长期更新,本文最近更新时间为:2026年6月15日。

点云侠的博客 3万+

Express.js实战指南:从零构建企业级Node.js应用架构

在Node.js生态中,构建Web应用时最常遇到的挑战是什么?是路由管理混乱、中间件难以复用,还是错误处理不完善?这些问题往往源于项目结构设计不当。Express.js作为Node.js最流行的Web框架,其真正的价值不仅在于简化HTTP请求处理,更在于提供了构建可维护、可扩展应用架构的完整工具箱。 本文将带你深入Express.js的核心设计哲学,通过实际案例展示如何从简单的"Hello Wo

gitblog_01190的博客 451

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Node Hero 系列之:使用 Passport.js 做 Node.js 身份验证

本文是 Node Hero 系列教程的第八篇——通过这些章节,你将学会如何开始使用 Node.js 发布软件产品。 本篇 Passport.js 教程将带你一步步使用 Redis 搭建 Node.js 本地身份验证策略。你将学会如何使用 Passport.js 创建身份验证界面,用户在界面里提供用户名和密码。虽然看起来复杂,但是在 Node.js 中实现身份验证机制还是比较容易的。 本系列全部文章: Node Hero 系列之:开始使用 Node.js Node Hero 系列之:npm 教程 N

ycclydy的博客 301

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

express 4.0 session 用法与填坑指南

Nodejs学习笔记 使用express框架,搭建网站,学习一些必要的web代码写法,今天涉及的是session的用法。 看见blog.fens.me中的一些文章,照着开始学习nodejs的session用法,但是因为blog中作者学习的比较早,express4.0按照当时的开发存在一定的问题,网上有许多的解决办法,但是不能直接使用,或者感觉少了一些我想要的东西,自己睡前把这些东西总结下,备案

zxwiiiii的专栏 586

nodejs+express+express-session+redis 实现登陆验证

redis.js var ioRedis = require('ioredis'); var logger = require('./logger'); var redis = new ioRedis(); // 默认127.0.0.1:6379 // redis 链接错误 redis.on("error", function (erro...

weixin_33832340的博客 757

Nodejs 第二十九章(express)

Express是一个流行的Node.js Web应用程序框架,用于构建灵活且可扩展的Web应用程序和API。它是基于Node.js的HTTP模块而创建的,简化了处理HTTP请求、响应和中间件的过程。简洁而灵活:Express提供了简单而直观的API,使得构建Web应用程序变得简单快捷。它提供了一组灵活的路由和中间件机制,使开发人员可以根据需求定制和组织应用程序的行为。路由和中间件:Express使用路由和中间件来处理HTTP请求和响应。开发人员可以定义路由规则,将特定的URL路径映射到相应的处理函数。

qq1195566313的博客 2722

express中session的基本使用

第一步下载第三方模块 npm install express-session 配置模块 //引入session第三方模块 const session = require('express-session'); //配置session模块 app.use(session({secret:'secret key'})); 使用 //引入框架 const express = require('express'); //创建路由 const admin = express.Router(); //集合构造函数

forljnlearning的博客 370

Midway 认证鉴权实战:@midwayjs/passport 组件用法、版本演进与源码实现全解析

身份验证是绝大多数 Web 应用无法绕开的核心能力。Midway 将 Node.js 生态中最流行的 Passport 库封装为 `@midwayjs/passport` 组件,通过「策略(Strategy)+ 中间件(Middleware)」的可插拔模式,让开发者可以用几乎一致的代码完成本地账号密码认证、JWT 无状态认证、GitHub 等第三方 OAuth 登录。本篇文章以 [packages

gitblog_01026的博客 387

探索Express-Blog: 一个简洁高效的Node.js博客框架

探索Express-Blog: 一个简洁高效的Node.js博客框架 在前端开发日新月异的今天,寻找一个简单易用、功能齐全且易于扩展的博客系统是许多开发者的需求。今天,我们向大家推荐一款基于Node.js和Express构建的开源博客框架——。这个项目提供了一个快速搭建个人博客的解决方案,让开发者可以更专注于内容创作。 项目简介 Express-Blog是一个轻量级的博客系统,它利用了Node.j...

gitblog_00034的博客 358
上一篇: Express 后端三层模型:让你的 API 架构更优雅
下一篇: 前端文件下载的三种方式:URL、二进制与 Base64 的深度解析
十八朵郁金香
十八朵郁金香 优质创作者: 前端开发技术领域 优质创作者: 前端开发技术领域
博客等级 码龄5年 6415粉丝 107原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十八朵郁金香

感恩前行路上有你相伴

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值