Express中間件和路由及響應方法

1.中間件分類

應用程序級別中間件

????????通過?app.use()?或?app.METHOD()(如?app.get)綁定的中間件,作用于整個應用程序。例如

記錄請求日志、解析請求體等全局功能。例如:

app.use((req, res, next) => {console.log('Request URL:', req.url);next();
});
路由級別中間件

????????綁定到?router.use()?或?router.METHOD()?的中間件,僅對特定路由生效。常用于分組路由的

共享邏輯(如權限校驗)。例如:

const router = express.Router();
router.use((req, res, next) => {if (req.user.isAdmin) next();else res.status(403).send('Forbidden');
});
錯誤處理中間件

????????接收四個參數?(err, req, res, next),用于捕獲并處理同步/異步錯誤。需定義在中間件鏈

末尾。例如:

app.use((err, req, res, next) => {console.error(err.stack);res.status(500).send('Server Error');
});
內置中間件

Express 提供的開箱即用功能,如?express.json()?解析 JSON 請求體:

app.use(express.json());
第三方中間件

通過 npm 安裝的中間件,例如?cors?處理跨域、helmet?增強安全性:

app.use(require('cors')());

2.中間件的使用

app.js文件中:

const express = require("express");const app = express();
const routerIndex=require("./router/index")
const videoRouter=require("./router/vedio")
const PORT = process.env.PORT || 3000;// 設置日志中間件 中間件代碼的位置很有講究 必須是所有路由的前面才行
app.use((req, res, next) => {console.log(`${req.method} ${req.url},${Date.now()}`);// 繼續處理下一個中間件或路由處理函數next();
},function(req, res, next) { console.log('輸出了日志,然后就可以執行這里面的代碼,可以寫多個這樣的函數,然后使用next()執行下一個函數');next();
});
// 當有四個參數時,會默認這是個錯誤處理中間件
app.use((err,req,res,next)=>{console.log(err,'錯誤信息');res.status(500).send("服務器錯誤")
})
// 掛載路由  所有的路由前面都要加 /api,相當于vue的反向代理
app.use('/api',routerIndex);
app.use('/vedio',videoRouter)
// 掛載統一處理服務端錯誤中間件
// app.use(errorHandler());// all 方法,可以處理 /xx 路徑傳過來的所有請求方法都可以觸發,不管時get、post、put請求都會觸發它
app.all('/xx',(req,res)=>{res.send('xx')
})app.listen(PORT, () => {console.log(`Server is running at http://localhost:${PORT}`);
});

在app.js文件同級的router文件夾下的index.js:

const express = require('express')const router = express.Router()router.get('/',(req,res)=>{console.log(req.method);res.send('/index')
})
router.get('/users',(req,res)=>{console.log(req.method);res.send('/users')
})module.exports = router

在app.js文件同級的router文件夾下的vedio.js:

const express =require('express')
const router=express.Router()
// 這里的路由不是前端的跳轉頁面路由,而是后端的接口路由路徑
router.get('/list',(req,res)=>{console.log('list');res.send('list')
})
module.exports=router

3.路由

// 可以匹配正則,/us+er表示匹配多個s疊加的路徑,比如/usser、/ussser
app.get('/us+er',(req,res)=>{res.send(`${req.method} ${req.url}`)
})

獲取路由參數:

router.get('/list/:id',(req,res)=>{// 獲取路由參數console.log(req.params.id);res.send('list')
})

還可以鏈式調用:

router.get('/list/:id/are/:age',(req,res)=>{// 獲取路由參數console.log(req.params.id);  // {id:2,age:3}res.send('list')
})
.post('/vedio',(req,res)=>{res.send('list')
})

使用res.render渲染:

// app.js文件
const express = require("express");
const app = express();
const path = require('path');
// 設置模板引擎(以 EJS 為例)
app.set('view engine', 'ejs');
// 設置視圖文件目錄
app.set('views', path.join(__dirname, 'views'));
const routerIndex=require("./router/index")
// 所有的路由前面都要加 /api,相當于vue的反向代理
app.use('/api',routerIndex);// router/index.js文件
const express = require('express')
const router = express.Router()
router.get('/',(req,res)=>{console.log(req.method);// res.render 是服務器端渲染,頁面跳轉到views/test/index.html頁面中 res.render('test/index', { name: 'Express 路由1' });// res.send('/index')
})
module.exports = router// views/test/index.ejs文件
<!DOCTYPE html>
<html lang="zh-CN"><head><metaname="viewport"content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"/><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title><%= name %></title></head><body><h1>Hello, <%= name %></h1></body><script>function corsGetData() {alert("dsafdsafdsafsda");}</script>
</html>// 安裝ejs
npm install ejs

效果:(請求?http://127.0.0.1:3000/api/?直接渲染頁面)

其他的響應方法:

// 這里的路由不是前端的跳轉頁面路由,而是后端的接口路由路徑
router.get('/list/:id',(req,res)=>{// 獲取路由參數console.log(req.params.id);// 下載文件  提示客戶端下載文件res.download('./files/report.pdf')// 結束響應過程  不發送任何數據,直接結束響應// 通常用于簡單響應或與 res.write() 配合使用res.end()// 發送 JSON 格式的響應 自動設置 Content-Type 為 application/jsonres.json({ message: 'Hello World' })// 重定向到指定的 URL  默認發送 302 狀態碼res.redirect('/login')// 渲染模板引擎視圖res.render('index.ejs', { title: '首頁' })// res.render 是服務器端渲染,頁面跳轉到views/test/index.html頁面中 res.render('test/index', { name: 'Express 路由1' });// 發送文件作為響應res.sendFile('/views/index.html')// 設置響應狀態碼并發送其字符串表示作為響應體res.sendStatus(404) // 會發送 404 狀態碼和 "Not Found" 字符串res.send('list')
})

4. 設置跨域和記錄日志

// 跨域
npm i cors
// 請求日志中間件
npm i morgan

在app.js文件中:

const cors =require('cors')
const morgan =require('morgan')
app.use(cors())
app.use(morgan('dev'))// 只記錄開發時的日志

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/92598.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/92598.shtml
英文地址,請注明出處:http://en.pswp.cn/web/92598.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Dokcer創建中間件環境

簡而言之&#xff0c;用docker來搞中間件環境比價好使&#xff0c;不用關心各種環境了 rabbitmqsudo docker run -d \--name rabbitmq \-p 5672:5672 \-p 15672:15672 \rabbitmq:3.8-managementredis 5.0.3 docker start my-redisdocker run --name my-redis -d -p 6379:6379 \…

Linux高級編程-文件操作

1.Linux下的文件類型7種文件類型&#xff1a;b 塊設備文件 -------> 存儲類設備&#xff08;硬盤&#xff09; c 字符設備文件 ------->如輸入輸出設備&#xff08;鼠標鍵盤顯示器...&#xff09; d 目錄文件 ------->文件夾 - 普通文件 -------&g…

web:vue中import *** from 和import {***} from的區別

在Vue.js中,import語句用于導入模塊、組件或變量等。使用帶花括號{}和不帶花括號的區別主要在于導入的內容是具名導出(named exports)還是默認導出(default export)。 默認導入 (Default Import) - 不帶花括號 import Vue from vue; import MyComponent from ./MyCompone…

Mysql如何優化my.conf配置文件?

優化 MySQL 的 my.cnf 配置文件&#xff0c;可以顯著提升數據庫性能&#xff0c;特別是在高并發或大數據量場景下。以下是優化 my.cnf 的方法和建議&#xff0c;涵蓋 常見配置項、參數說明 和 優化技巧。1. 優化前的準備工作在修改 my.cnf 之前&#xff0c;需了解以下內容&…

Cherryusb UAC例程對接STM32內置ADC和DAC播放音樂和錄音(上)=>TIM+DAC+ADC+DMA正弦波回環測試

0. 概述 文本目標基于Cherryusb官方例程audio_v1_mic_speaker_multichan_template.c&#xff0c;底層對接STM32的內置ADC和DAC&#xff0c;實現錄音和播放。通過電腦播放歌曲&#xff0c;板子發出聲音。通過電腦錄音機開啟錄音&#xff0c;板子作為麥克風采集聲音&#xff0c;…

數模個人筆記

寫在前面&#xff1a;不建議觀看&#xff0c;會爛尾的1.馬氏鏈&#xff1a;狀態空間指的是隨機變量的取值范圍&#xff0c;xi稱為一個狀態&#xff0c;應用背景在現在的條件下下一狀態發生的概率&#xff0c;比如退火&#xff0c;他的條件概率可化簡為&#xff1a;且nm時刻的概…

Spring Boot自定義Starter:從原理到實戰全解析

1. 背景與需求1.1 什么是Starter&#xff1f; Spring Boot的起步依賴&#xff08;Starter&#xff09;是一種特殊的依賴描述符&#xff0c;用于簡化Spring應用的依賴管理和自動配置。官方文檔將Starter定義為“一組方便的依賴描述符”&#xff0c;開發者只需引入對應的Starter&…

安寶特方案丨工業AR+AI質檢方案:致力于提升檢測精度與流程效率

據IDC預測&#xff0c;2025年中國工業AI質檢市場規模將達62億元&#xff0c;年復合增長率28.5%&#xff0c;新能源、消費電子、高端裝備三大領域貢獻超70%市場份額。這一數據印證了AI質檢已從可選技術升級為制造業降本增效的生存剛需。當前制造業質檢環節正面臨&#xff1a;精度…

AudioLLM

參考鏈接&#xff1a;https://mp.weixin.qq.com/s/cscrUn7n_o6PdeQRzWpx8g 視頻教程&#xff1a;https://www.bilibili.com/video/BV1LGbozkEDY 模型代碼&#xff1a;https://github.com/boson-ai/higgs-audio 如果是兩個模型加在一起&#xff1a;一個語言模型&#xff0c;一個…

基于 CEP 引擎的算法拆單與調度實踐—基礎篇

在金融市場中&#xff0c;大額訂單的一次性交易可能會對市場價格產生較大沖擊&#xff0c;導致交易成本增加。例如&#xff0c;大額買入訂單可能會迅速推高股價&#xff0c;使后續買入成本上升&#xff1b;大額賣出訂單則可能打壓股價&#xff0c;造成資產賤賣。拆單算法通過將…

開源 C# TCP 通信框架 SocketDJ 發布:輕量、免費、可擴展

前言市面上的網絡通信框架琳瑯滿目&#xff0c;功能強大者有之&#xff0c;但不少都存在功能閉源、商業收費、學習成本高等問題。作為一名熱愛底層技術的開發者&#xff0c;我始終相信&#xff1a;基礎通信能力應當簡單、透明且免費。最近正好有項目需求&#xff0c;索性動手從…

移動機器人路徑規劃中ROS2中間件性能的研究綜述

導讀&#xff1a; 隨著移動機器人在工業自動化、特種作業及智能服務領域的廣泛應用&#xff0c;其路徑規劃能力越來越依賴機器人操作系統ROS2的通信性能。ROS2通過去中心化架構與數據分發服務中間件顯著提升了系統可靠性&#xff0c;但動態復雜環境中路徑規劃對通信延遲、帶寬…

【昇騰】Atlas 500 A2 智能小站制卡從M.2 SATA盤啟動Ubuntu22.04系統,重新上電卡死沒進系統問題處理_20250808

一、問題背景 Atlas 500 A2智能小站是華為基于20T 12G版本的Atlas 200I A2加速模塊開發的面向廣泛邊緣應用場景的輕量邊緣設備&#xff0c;具有超強計算性能、配置靈活、體積小、支持溫度范圍寬、環境適應性強、易于維護 管理等特點的產品。Atlas 500 A2智能小站主要應用在智能…

sigaction 中 sa_handler = SIG_IGN 的深度解析與應用實踐

sigaction 中 sa_handler SIG_IGN 的深度解析與應用實踐 核心意義&#xff1a;主動忽略信號 當 sa_handler 設置為 SIG_IGN 時&#xff0c;內核將完全丟棄指定的信號&#xff0c;不會&#xff1a; 執行默認行為調用任何處理函數中斷進程的正常執行 這與 SIG_DFL&#xff08;默…

【LLM實戰|langchain、qwen_agent】RAG高級

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?type=blog 0. 前言 RAG高級 1. RAG 高效召回方法 合理設置TOP-K 改進索引算法 -知識圖譜 引入重排序 重排序模型 BGE-Rerank Cohere Rerank 混合檢索 向量索引+關鍵詞索引…

C++方向知識匯總(一)

關于單例模式1.什么是單例模式&#xff1f;答&#xff1a;單例模式是一種創建型設計模式&#xff0c;確保一個類在運行期間僅有一個實例&#xff0c;提供全局唯一的訪問點2.單例模式的目的&#xff1f;答&#xff1a;避免重復創建資源消耗大的對象&#xff0c;例如日志系統、線…

學習:JS[8]本地存儲+正則表達式

一.本地存儲1.介紹將數據存儲到用戶瀏覽器當中設置、讀取方便、頁面刷新不丟失數據2.本地存儲分類-localStoragea.語法(1)存儲數據//存儲數據 localStorage.setItem(鍵,值)如 localStorage.setItem(uname,哈哈)(2)獲取數據//獲取方式 都加引號 localStorage.getItem(鍵) localS…

C++算法練習:單詞識別

做題記錄&#xff1a;牛客習題&#xff1a;單詞識別 相關題目代碼已經提交到gitee中&#xff1a;樓田莉子 (riko-lou-tian) - Gitee.com喜歡請點個贊謝謝 目錄 題目&#xff1a; C 字符函數頭文件頭文件&#xff1a;&#xff08;C 標準庫&#xff09;核心函數功能說明&#…

從免費到盈利:Coze智能體1小時封裝變現全流程指南——井云科技

在AI技術普惠的浪潮下&#xff0c;Coze等智能體平臺讓零代碼開發者也能快速構建功能強大的AI助手。然而&#xff0c;許多創作者在完成智能體開發后&#xff0c;卻面臨“工具免費、成本自擔”的困境——用戶無限制調用導致算力成本飆升&#xff0c;想收費又缺乏成熟的支付與用戶…

C++學習之STL學習:map/set

通過前面的學習&#xff0c;我們已經對C STL有了初步了解。然而&#xff0c;STL作為一個龐大復雜的體系&#xff0c;遠不止這些內容。接下來&#xff0c;我們將深入探討STL中的另外兩個重要組件——map和set。 作者的個人gitee&#xff1a;樓田莉子 (riko-lou-tian) - Gitee.co…