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

编写中间件以用于 Express 应用程序

概述

中间件函数能够访问请求对象 (req)、响应对象 (res) 以及应用程序的请求/响应循环中的下一个中间件函数。下一个中间件函数通常由名为 next 的变量来表示。

中间件函数可以执行以下任务:

  • 执行任何代码。
  • 对请求和响应对象进行更改。
  • 结束请求/响应循环。
  • 调用堆栈中的下一个中间件。

如果当前中间件函数没有结束请求/响应循环,那么它必须调用 next(),以将控制权传递给下一个中间件函数。否则,请求将保持挂起状态。

以下示例显示中间件函数调用的元素:

中间件函数适用的 HTTP 方法。

中间件函数适用的路径(路由)。

中间件函数。

中间件函数的回调自变量,按约定称为“next”。

中间件函数的 HTTP 响应自变量,按约定称为“res”。

中间件函数的 HTTP 请求自变量,按约定称为“req”。

以下是“Hello World”Express 应用程序的简单示例,将为其定义两个中间件函数:


var express = require('express');
var app = express();app.get('/', function (req, res) {res.send('Hello World!');
});app.listen(3000);

开发

以下是称为“myLogger”的中间件函数的简单示例。此函数仅在应用程序的请求通过它时显示“LOGGED”。中间件函数会分配给名为 myLogger的变量。


var myLogger = function (req, res, next) {console.log('LOGGED');next();
};

请注意以上对 next() 的调用。调用此函数时,将调用应用程序中的下一个中间件函数。 next() 函数不是 Node.js 或 Express API 的一部分,而是传递给中间件函数的第三自变量。next() 函数可以命名为任何名称,但是按约定,始终命名为“next”。为了避免混淆,请始终使用此约定。

要装入中间件函数,请调用 app.use() 并指定中间件函数。 例如,以下代码在根路径 (/) 的路由之前装入 myLogger 中间件函数。


var express = require('express');
var app = express();var myLogger = function (req, res, next) {console.log('LOGGED');next();
};app.use(myLogger);app.get('/', function (req, res) {res.send('Hello World!');
});app.listen(3000);

应用程序每次收到请求时,会在终端上显示消息“LOGGED”。

中间件装入顺序很重要:首先装入的中间件函数也首先被执行。

如果在根路径的路由之后装入 myLogger,那么请求永远都不会到达该函数,应用程序也不会显示“LOGGED”,因为根路径的路由处理程序终止了请求/响应循环。

中间件函数 myLogger 只是显示消息,然后通过调用 next() 函数将请求传递到堆栈中的下一个中间件函数。

下一个示例将名为 requestTime 的属性添加到请求对象。我们将此中间件函数命名为“requestTime”。


var requestTime = function (req, res, next) {req.requestTime = Date.now();next();
};

现在,该应用程序使用 requestTime 中间件函数。此外,根路径路由的回调函数使用由中间件函数添加到 req(请求对象)的属性。


var express = require('express');
var app = express();var requestTime = function (req, res, next) {req.requestTime = Date.now();next();
};app.use(requestTime);app.get('/', function (req, res) {var responseText = 'Hello World!';responseText += 'Requested at: ' + req.requestTime + '';res.send(responseText);
});app.listen(3000);

您向应用程序根发出请求时,此应用程序当前在浏览器中显示请求的时间戳记。

因为您拥有请求对象、响应对象、堆栈中的下一个中间件函数以及整个 Node.js API 的访问权,所以中间件函数的可能性是无穷的。

相关文章:

编写中间件以用于 Express 应用程序

概述 中间件函数能够访问请求对象 (req)、响应对象 (res) 以及应用程序的请求/响应循环中的下一个中间件函数。下一个中间件函数通常由名为 next 的变量来表示。 中间件函数可以执行以下任务: 执行任何代码。对请求和响应对象进行更改。结束请求/响应循环。调用堆…...

【2023年数学建模国赛】D题解题思路

2023年数学建模国赛D题解题思路 为了解决问题1、问题2和问题3,我们可以采用动态规划方法来制定生产计划,考虑了不确定性因素和多种可能情况的预案集。首先,我们需要定义一些变量和符号: T T T:总的养殖周期&#xff0…...

python爬虫之正则表达式学习

网络安全离不开脚本和工具的开发,python很多又需要正则表达式。 这是一个很好的学习正则表达式的项目 https://github.com/ziishaned/learn-regex/blob/master/translations/README-cn.md 基本匹配 正则表达式其实就是在执行搜索时的格式,它由一些字…...

智慧能源方案:TSINGSEE青犀AI算法中台在能源行业的应用

一、方案背景 互联网、物联网、人工智能等新一代信息技术引领新一轮产业革命,加快能源革命步伐。尤其是随着人工智能技术的不断发展,AI智能检测与识别技术在能源行业的应用也越来越广泛。与此同时,国家出台多项政策,将智慧能源纳…...

达梦数据库awr报告收集

1、找出快照点snap_id与时间的对应关系 SYS.WRM$_SNAPSHOT表中记录了快照点snap_id与时间的对应关系 例如如下语句可以得出2023-09-04这一天各个时间点对应的快照点snap_id select snap_id,end_interval_time from SYS.WRM$_SNAPSHOT where end_interval_time between to…...

c语言练习43:深入理解strcmp

深入理解strcmp strcmp的主要功能是用来比较两个字符串 模拟实现strcmp 比较两个字符串对应位置上的大小 按字典序进行比较 例如: 输入:abc abc 输出:0 输入:abc ab 输出:>0的数 输入:ab abc …...

NUC980webServer开发

目录 1.RTL8189FTV驱动移植 2.wifi配置工具hostapd移植 1.openssl-1.0.2r交叉编译 2.libnl-3.2.25.tar.gz交叉编译 3.hostapd-2.9.tar.gz交叉编译 4.移植相关工具到开发板 1.RTL8189FTV驱动移植 1. 把驱动文件源码放在linux源码的drivers/net/wireless/realtek/rtlwifi/目录…...

驱动开发--day2

实现三盏灯的控制,编写应用程序测试 head.h #ifndef __HEAD_H__ #define __HEAD_H__#define LED1_MODER 0X50006000 #define LED1_ODR 0X50006014 #define LED1_RCC 0X50000A28#define LED2_MODER 0X50007000 #define LED2_ODR 0X50007014#endif mychrdev.c #inc…...

用户促活留存新方式——在APP中嵌入小游戏

随着APP同类产品的不断出现,APP开发者们面临着激烈的竞争,很多APP下载后被新的APP取代,获客成本越来越高。同时开发者还会面临用户粘性差、忠诚度低、用完即走、留存困难,商业化价值被大大缩减。 在APP中植入小游戏来提高用户活跃…...

MySQL 8.0.34(x64)安装笔记

一、背景 从MySQL 5.6到5.7,再到8.0,版本的跳跃不可谓不大。安装、配置的差别也不可谓不大,特此备忘。 二、过程 (1)获取MySQL 8.0社区版(MySQL Community Server)   从 官网 字样 “MySQL …...

物流供应商实现供应链自动化的3种方法

当前影响供应链的全球性问题(如新冠肺炎疫情)正在推动许多物流供应商重新评估和简化其流程。运输协调中的摩擦只会加剧供应商无法控制的现有延误和风险。值得庆幸的是,供应链专业人员可以通过端到端的供应链自动化消除延迟,简化与合作伙伴的沟通&#xf…...

Mysql更新时间列只改日期为指定日期不更改时间

场景 Mysql分表后同结构不同名称表之间复制数据以及Update语句只更新日期加减不更改时间: Mysql分表后同结构不同名称表之间复制数据以及Update语句只更新日期加减不更改时间_霸道流氓气质的博客-CSDN博客 上面通过如下方式实现日期列增加指定天数。 UPDATE bus…...

实时测试工具 Visual Studio 扩展 NCrunch 4.18 Crack

NCrunch Visual Studio 扩展 .NET 的终极实时测试工具 在编码时查看实时测试结果和内联指标。 下载v4.18 发布于 2023 年 7 月 17 日 跳过视频至: 代码覆盖率 指标 分布式处理 配置 发动机模式 Visual Studio 自动并发测试 NCrunch 是一个完全自动化的测试扩展&a…...

Neo4j 基本语法

一、基本语法 1、新建节点 (1)基本语法: () 代表节点 示例: CREATE (u:User {uid:970939424 }) // 节点类型为User,属性值为uid970939424CREATE (u:Round {rid:7194842697444819113 }) // 节点类型为Rou…...

docker常见面试题

1.什么是docker docker是一个容器化平台,类似于一个集装箱,集装箱与集装箱之间互不影响,docker平台就是一个软件集装箱平台,我们可以构建应用程序,将其所有的依赖打包到一个容器中,然后就很方便的可以在其…...

静态路由:配置和使用详解

文章目录 一、静态路由的配置和使用详解1. 配置要点1.1 点到点接口配置1.2 以太网接口配置 2. 默认路由3. 静态路由的配置命令4. 静态路由实现路由备份和负载分担 二、静态路由的优先级和比较1. 静态路由的优先级设置2. 静态路由与动态路由的比较2.1 静态路由优缺点2.2 动态路由…...

玩转Mysql系列 - 第15篇:详解视图

这是Mysql系列第15篇。 环境:mysql5.7.25,cmd命令中进行演示。 需求背景 电商公司领导说:给我统计一下:当月订单总金额、订单量、男女订单占比等信息,我们啪啦啪啦写了一堆很复杂的sql,然后发给领导。 …...

0065__git fetch, git pull, git merge, git rebase

git fetch, git pull, git merge, git rebase_git pull和merge_送你一朵小莲花的博客-CSDN博客...

AJAX学习笔记4解决乱码问题

AJAX学习笔记3练习_biubiubiu0706的博客-CSDN博客 在Tomcat10来说,AJAX GET或者POST接收响应都不存在乱码问题 对于Tomcat9来说 前端测试代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>测试A…...

【23种设计模式】享元模式【⭐】

个人主页&#xff1a;金鳞踏雨 个人简介&#xff1a;大家好&#xff0c;我是金鳞&#xff0c;一个初出茅庐的Java小白 目前状况&#xff1a;22届普通本科毕业生&#xff0c;几经波折了&#xff0c;现在任职于一家国内大型知名日化公司&#xff0c;从事Java开发工作 我的博客&am…...

《技术底稿 40》别只看文件大小:一次 “反常 OOM” 背后的内存缓存重构

一、反常现象&#xff1a;小文件报错&#xff0c;大文件反倒正常业务场景需批量导入文献类 ZIP 压缩包。本次测试出现诡异问题&#xff1a;一个 282MB 的 ZIP 包导入时&#xff0c;直接抛出 java.lang.OutOfMemoryError: Java heap space 堆内存溢出。当前服务 JVM 堆内存固定配…...

腾讯云服务器跑通 Cube Sandbox:从 PVM 内核到 65 ms 冷启动的全程实战

腾讯云服务器跑通 Cube Sandbox&#xff1a;从 PVM 内核到 65 ms 冷启动的全程实战 适合第一次想把 Cube Sandbox 真正跑起来的开发者。本文用一台普通腾讯云 CVM&#xff08;OpenCloudOS 9.4 / 8C16G / 无嵌套虚拟化&#xff09;&#xff0c;从空白系统一路推到 Sandbox.creat…...

从CI/CD到生产回滚:Gemini嵌入Java构建链的4层审查网(含Gradle/Maven插件零侵入部署脚本)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;Gemini Java代码审查 Google Gemini 模型&#xff08;特别是 Gemini 1.5 Pro 及后续版本&#xff09;已展现出对 Java 代码语义理解、缺陷识别与重构建议的强推理能力。在实际工程中&#xff0c;可将其集成至…...

全栈开发的核心技能:掌握这4个技术,成为全栈工程师

对于很多深耕测试领域多年的软件测试从业者来说&#xff0c;“转全栈开发”早已不是一个陌生的方向——无论是为了突破职业瓶颈&#xff0c;还是为了打通测试到开发的链路&#xff0c;提升自己的端到端交付能力&#xff0c;抑或是拓展职业选择的边界&#xff0c;全栈工程师都是…...

具身智能赋能:无感定位打破 UWB 传统空间交互局限

具身智能赋能&#xff1a;无感定位打破 UWB 传统空间交互局限人工智能技术向实体空间深度渗透&#xff0c;具身智能成为空间计算领域进阶发展的核心方向。区别于传统算法仅停留在数据层面分析决策&#xff0c;具身智能依托空间感知能力让智能体系拥有环境理解、自主交互、动态适…...

【下载安装教程】仿宋GB2312、楷体GB2312和方正小标宋简体办公字体安装包下载安装教程

常用办公字体安装与使用指南 适用字体及场景 字体名称适用场景仿宋_GB2312正文内容、正式文档楷体_GB2312批注、说明性文字方正小标宋简体标题、封面文字、强调性内容 支持软件 WPSMicrosoft WordPowerPoint其他主流办公软件 使用方法 安装字体 下载字体文件&#xff08;.…...

Creality Print:从新手到专家的完整3D打印切片软件指南

Creality Print&#xff1a;从新手到专家的完整3D打印切片软件指南 【免费下载链接】CrealityPrint 项目地址: https://gitcode.com/gh_mirrors/cr/CrealityPrint 在3D打印的世界里&#xff0c;切片软件是连接数字模型与物理实体的关键桥梁。无论您刚刚接触3D打印&…...

OpenClaw 用户通过 Taotoken 快速接入并启用 Agent 工作流

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 OpenClaw 用户通过 Taotoken 快速接入并启用 Agent 工作流 对于使用 OpenClaw 框架构建 AI Agent 的开发者而言&#xff0c;能够灵…...

单北斗GNSS变形监测系统在地质灾害监测中的应用与维护

北斗 GNSS 变形监测系统在地质灾害监测中发挥着重要作用。它通过高精度定位&#xff0c;实时捕捉地面形变&#xff0c;为防灾减灾提供精准数据支持。系统的定制化设计能适应不同环境&#xff0c;同时具备稳定性与可靠性。随着技术发展&#xff0c;监测和维护也变得更高效。这种…...

Sora 2生成3分钟以上视频总卡顿、跳帧?:5步精准定位帧间语义断裂点并修复

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;Sora 2生成3分钟以上视频总卡顿、跳帧&#xff1f;&#xff1a;5步精准定位帧间语义断裂点并修复 长时序视频生成中&#xff0c;Sora 2 在输出超过180秒内容时频繁出现视觉跳变、运动不连贯及语义突兀中断&am…...