Node.js - Express框架

1. 介紹

Express 是一個基于 Node.jsWeb 應用程序框架,主要用于快速、簡便地構建 Web 應用程序API。它是目前最流行的 Node.js Web 框架之一,具有輕量級、靈活和功能豐富的特點。

核心概念包括路由,中間件,請求與響應,以及模板引擎支持

2. Express應用的使用

通過npm進行安裝express包

npm install express

示例:以下是一個最簡單的Express應用程序

const express = require('express');
const app = express();// 路由:處理 GET 請求
app.get('/', (req, res) => {res.send('Hello, Express!');
});// 路由:處理動態參數
app.get('/user/:id', (req, res) => {res.send(`User ID: ${req.params.id}`);
});// 啟動服務器
const PORT = 3000;
app.listen(PORT, () => {console.log(`Server is running on http://localhost:${PORT}`);
});

3. 應用程序對象

Express的核心,負責注冊路由和中間件。

使用express()函數創建一個Express應用程序的實例。

const app = express();

4. 路由

Express提供了靈活的路由機制,用于定義應用如何響應客戶端的請求

get請求

用于從服務器獲取資源(例如網頁、數據),請求參數通常附加在URL的查詢字符串中,適用于獲取數據或無敏感信息的請求

const express = require('express');
const app = express();app.get('/', (req, res) => {res.send('歡迎訪問首頁!');
});// 帶查詢參數的 GET 請求
app.get('/search', (req, res) => {const query = req.query; // 獲取查詢參數res.send(`搜索內容:${query.keyword}`);
});app.listen(3000, () => console.log('服務器運行在 http://localhost:3000'));

訪問方式:直接在瀏覽器地址欄輸入即可

http://localhost:3000/search?keyword=express

request對象中包含了與HTTP請求相關的信息,例如請求頭,URL,參數等信息

屬性描述
req.params包含動態路由中的參數,格式為對象。例如:/user/:idreq.params.id 獲取 id 參數
req.query包含查詢字符串參數,格式為對象。例如:?name=Johnreq.query.name 獲取 name 參數
req.body包含 POST 請求的請求體數據,需要中間件解析(如 express.json()express.urlencoded()
req.headers包含 HTTP 請求頭信息,格式為對象。
req.headers包含 HTTP 請求頭信息,格式為對象
req.methodHTTP 請求的方法,例如:GETPOSTPUTDELETE
req.url請求的完整 URL
req.path請求的路徑部分(不包括查詢字符串)
req.hostname請求的主機名,不包括端口號
req.ip客戶端的 IP 地址

示例:簡易的查找返回

const express = require("express")
const file = require("./test.json")
const app = express();app.get('/singer/:id.html',(req,res)=>{let {id} = req.params;let result = file.find(item=>{if (item.id === Number(id)){return true;}})if (!result){res.statusCode=404;renderBlock.end(`<h1>404 NOT FOUND<h1>`);return;}
})

post請求

post請求則是用于向服務器提交數據,例如表單數據,JSON數據,通常會改變服務器上的數據,例如添加,修改或刪除資源等操作

<!DOCTYPE html>
<html><head></head><body><form method="post" action="http://127.0.0.1:3000/submit"><textarea placeholder="輸入用戶名"></textarea><button>登錄</button></from></body>
</html>
const express = require('express');
const app = express();app.use(express.json()); // 解析 JSON 格式的請求體
app.use(express.urlencoded({ extended: true })); // 解析 URL 編碼的請求體// POST 路由
app.post('/submit', (req, res) => {const body = req.body; // 獲取請求體數據res.send(`提交的數據:${JSON.stringify(body)}`);
});app.listen(3000, () => console.log('服務器運行在 http://localhost:3000'));

response包含了與HTTP響應相關的方法和屬性,用于向客戶端返回數據

方法描述
res.send(body)發送響應數據,可以是字符串,對象,Buffer等
res.json(body)發送 JSON 格式的響應
res.status(code)設置響應狀態碼,例如:res.status(404)
res.redirect(url)重定向到指定 URL
res.render(view, data)渲染視圖模板并發送響應(需要配置模板引擎)
res.set(header, value)設置響應頭
res.cookie(name, value)設置 Cookie(需要 cookie-parser 中間件)
res.clearCookie(name)清除指定的 Cookie
res.type(type)設置content-type響應頭
res.sendFile()返回服務器中的文件
res.end()結束響應,但不發送數據

Response對象常見操作:

跳轉響應

app.get('/other',(req,res)=>{res.redirect('http://www.baidu.com')})

下載響應

app.get('/other',(req,res)=>{res.download(__dirname+'/package.json')})

JSON響應

app.get('/other',(req,res)=>{res.json({name:"Ricardo"})})

響應文件內容

用于展示HTML文件等信息

app.get('/other',(req,res)=>{res.sendFile(__dirname+'/test.html')})

4. express中間件

中間件(Middleware) 是 Express 中處理請求和響應的核心機制。它是一個函數,用于處理請求對象 (req)、響應對象 (res),以及在請求-響應周期中執行后續中間件的 next 方法,在路由處理之前或者之后執行。

簡單來講,中間件可以攔截請求、執行某些操作,然后決定是否將請求傳遞給下一個中間件;它們可以用來處理日志記錄、認證、數據解析、錯誤處理等任務。

中間件的基本形式:

function middleware(req, res, next) {// 中間件邏輯next(); // 調用 next() 將請求傳遞給下一個中間件
}

4.1?全局中間件

每一個請求到達服務器之后都會執行全局中間件函數,直接綁定到應用對象app上,作用域所有或指定的路由

const express = require("express");
const path = require("path");
const fs = require("fs");const app = express();// 聲明中間件函數
function recordMiddleware(req, res, next) {let { url, ip } = req;fs.appendFileSync(path.resolve(__dirname, './access.log'),`${url} ${ip}\r\n`);next(); // 必須調用 next() 將請求傳遞給后續中間件或路由
}// 使用中間件
app.use(recordMiddleware);app.get('/home', (req, res) => {res.send("Hello express");
});app.get('/admin', (req, res) => {res.send('后臺');
});// 處理 404 請求
app.all('*', (req, res) => {res.send("<h1>404 NOT FOUND</h1>");
});// 啟動服務器
app.listen(3000, () => {console.log("The server started on port 3000");
});

4.2 專有/路由級中間件

與路由綁定,僅作用于特定路由

function recordMiddleware(req, res, next) {let { url, ip } = req;fs.appendFileSync(path.resolve(__dirname, './access.log'),`${url} ${ip}\r\n`);next(); // 必須調用 next() 將請求傳遞給后續中間件或路由
}app.get('/home', recordMiddleware,(req, res) => {res.send("Hello express");
});

需要在中間件中聲明next才會進一步執行之后回調函數的內容

4.3 靜態資源/內置中間件

app.use(express.static(__dirname+'/public'));

根據在public文件夾下的路徑即可訪問對應的文件

如果public目錄下有index.html文件,單獨有index.html路由的話,根目錄代碼'/'書寫誰在前顯示誰

中間件描述安裝
express.json()解析 JSON 格式請求體內置
express.urlencoded()解析 URL 編碼請求體(如表單數據)內置
express.static()提供靜態文件服務內置
morgan記錄 HTTP 請求日志需要安裝
cookie-parser解析請求中的 Cookie需要安裝
cors處理跨域請求需要安裝
helmet提高應用安全性需要安裝
body-parser解析請求體數據,功能與 express.json() 類似需要安裝
express-session管理會話需要安裝

示例:中間件獲取解析請求參數

首先,準備好我們的表單界面與服務端

<!DOCTYPE html>
<html><head></head><body><form action="http://127.0.0.1:3000/login" method="post">用戶名:<input type="text" name="username"><br>密碼:<input type="password" name="password"><br><button>登錄</button></form></body>
</html>
const express = require("express")const app = express();app.get('/login',(req,res)=>{res.sendFile(__dirname+'/form.html')
})app.post('/login',(req,res)=>{res.send('獲取用戶的數據')
})app.listen(3000,()=>{console.log('server is running...')
})

name=John&age=25

表單所返回的數據如上述所示,我們需要在服務器端獲取上述表單內容,需要使用到中間件?

使用中間件解析post請求所獲得的數據

const urlencodedParser = express.urlencoded({ extended: false });

使用中間件:

app.post('/login',urlencodedParser,(req,res)=>{console.log(req.body)res.send('獲取用戶的數據')
})

解析后的數據存放在req中body屬性中,解析的內容以對象的形式進行保存

{ name: 'John', age: '25' }

示例:防盜鏈

防止其他網站對資源進行訪問,通過header請求頭中refer所實現

app.use((req,res,next)=>{let referer = req.get('referer');if (referer){let url = new URL(referer);let hostname = url.hostname; //獲取站點信息if (hostname !== '127.0.0.1'){res.status(404).send('<h1>404 NOT FOUND</h1>')}
}
})

注意事項

1. 中間件順序很重要:中間件按照定義順序執行。

2. 確保調用next()如果不調用,后續中間件將不會執行。

5. 路由器(Router)

定義路由器級別的路由,用于為某一組路由邏輯進行模塊化管理(即創建“迷你應用”)。

它的作用范圍是局部的,綁定在特定的 Router 實例上。

反之使用app.get用于處理直接掛載到整個應用程序上的 HTTP GET 請求,作用范圍是全局的,綁定在整個 Express 應用實例上。

const express = require('express');
const app = express();
const router = express.Router();router.get('/about', (req, res) => res.send('關于頁面'));
router.get('/contact', (req, res) => res.send('聯系我們'));app.use('/info', router); // 將路由器掛載到 /info 路徑app.listen(3000);

最終訪問路由:

3000/info/about

6. 路由模塊化

單獨創建一個文件夾用于存儲不同作用的路由文件

//   ./routes/網站首頁.js
const express = require('express')const router = express()router.get('/home',(req,res)=>{res.send("網站首頁")
})module.exports = router;

模塊化進行聲明導出,方便在主文件中進行使用

- 在主文件中配置路由,使用use掛載即可

//  ./主文件.jsconst express = require("express");
const router = require('./route/home.js')const app = express();app.use(router);app.all("*",(req,res)=>{res.send("<h1>404 NOT FOUND<h1>")
})app.listen(3000,()=>{console.log("This server has been started")
})

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

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

相關文章

《光學遙感圖像中顯著目標檢測的多內容互補網絡》2021-9

一、簡介 在本文中&#xff0c;我們提出了一種新的多內容互補網絡 &#xff08;MCCNet&#xff09; 來探索 RSI-SOD 的多內容互補性。具體來說&#xff0c;MCCNet 基于通用的編碼器-解碼器架構&#xff0c;并包含一個名為 multi-content complementation module &#xff08;MC…

【STM8S】STM8S之自定義短、長、連擊按鍵

本文最后修改時間&#xff1a;2018年10月22日 01:57 一、本節簡介 本文介紹STM8S系列如何實現按鍵的短按、長按、連擊。 二、實驗平臺 編譯軟件&#xff1a;IAR for STM8 1.42.2 硬件平臺&#xff1a;stm8s003f3p6開發板 仿真器&#xff1a;ST-LINK 庫函數版本&#xff1a…

數據庫(MySQL)練習

數據庫&#xff08;MySQL&#xff09;練習 一、練習1.15練習練習 二、注意事項2.1 第四天 一、練習 1.15練習 win11安裝配置MySQL超詳細教程: https://baijiahao.baidu.com/s?id1786910666566008458&wfrspider&forpc 準備工作&#xff1a; mysql -uroot -p #以管理…

【深度學習地學應用|滑坡制圖、變化檢測、多目標域適應、感知學習、深度學習】跨域大尺度遙感影像滑坡制圖方法:基于原型引導的領域感知漸進表示學習(一)

【深度學習地學應用|滑坡制圖、變化檢測、多目標域適應、感知學習、深度學習】跨域大尺度遙感影像滑坡制圖方法&#xff1a;基于原型引導的領域感知漸進表示學習&#xff08;一&#xff09; 【深度學習地學應用|滑坡制圖、變化檢測、多目標域適應、感知學習、深度學習】跨域大…

RPC實現原理,怎么跟調用本地一樣

回答1 要讓?絡通信細節對使?者透明&#xff0c;我們需要對通信細節進?封裝&#xff0c;我們先看下?個 RPC 調?的流程涉及到哪些通 信細節&#xff1a; 1. 服務消費?&#xff08; client &#xff09;調?以本地調??式調?服務&#xff1b; 2. client stub 接收到調…

《C++11》并發庫:簡介與應用

在C11之前&#xff0c;C并沒有提供原生的并發支持。開發者通常需要依賴于操作系統的API&#xff08;如Windows的CreateThread或POSIX的pthread_create&#xff09;或者第三方庫&#xff08;如Boost.Thread&#xff09;來創建和管理線程。這些方式存在以下幾個問題&#xff1a; …

【記錄52】el-table-column 添加fixed屬性 滾動條無法滑動

問題&#xff1a; el-table-column 添加fixed屬性 滾動條無法滑動 使用element UI組件&#xff0c;用到el-table的el-table-column的fixed屬性時&#xff0c;當滾動條長度小于固定列時&#xff0c;滾動條無法通過鼠標去點擊滑動操作 原因 fixed是用來固定列的屬性&#xff0c;其…

rtthread學習筆記系列-- 22 dataqueue

文章目錄 22 dataqueue https://github.com/wdfk-prog/RT-Thread-Study 22 dataqueue 消息隊列&#xff1a;消息隊列能夠接收來自線程或中斷服務例程中不固定長度的消息&#xff0c;并把消息緩存在自己的內存空間中。其他線程也能夠從消息隊列中讀取相應的消息&#xff0c;而當…

了解Node.js

Node.js是一個基于V8引擎的JavaScript運行時環境&#xff0c;它允許JavaScript代碼在服務器端運行&#xff0c;從而實現后端開發。Node.js的出現&#xff0c;使得前端開發人員可以利用他們已經掌握的JavaScript技能&#xff0c;擴展技能樹并成為全棧開發人員。本文將深入淺出地…

微信小程序在使用頁面棧保存頁面信息時,如何避免數據丟失?

微信小程序在使用頁面棧保存頁面信息時避免數據丟失的方法&#xff1a; 一、使用全局變量存儲關鍵數據&#xff1a; 定義一個全局變量&#xff0c;例如在 app.js 中&#xff0c;用于存儲頁面的重要信息。在頁面的 onHide 或 onUnload 生命周期中&#xff0c;將需要保存的數據…

文件上傳 分片上傳

分片上傳則是將一個大文件分割成多個小塊分別上傳&#xff0c;最后再由服務器合并成完整的文件。這種做法的好處是可以并行處理多個小文件&#xff0c;提高上傳效率&#xff1b;同時&#xff0c;如果某一部分上傳失敗&#xff0c;只需要重傳這一部分&#xff0c;不影響其他部分…

js解決 Number失精度問題

const updatePromises adinfo.rows.map(async item > {const cwf await uniCloud.httpclient.request("https://api.oceanengine.com/open_api/v3.0/project/list/", {method: GET,data: {advertiser_id: item.account_id},// 1. 指定text數據格式dataType: tex…

實力認證 | 海云安入選《信創安全產品及服務購買決策參考》

近日&#xff0c;國內知名安全調研機構GoUpSec發布了2024年中國網絡安全行業《信創安全產品及服務購買決策參考》&#xff0c;報告從產品特點、產品優勢、成功案例、安全策略等維度對各廠商信創安全產品及服務進行調研了解。 海云安憑借AI大模型技術在信創安全領域中的創新應用…

Picocli 命令行框架

官方文檔 https://picocli.info/ 官方提供的快速入門教程 https://picocli.info/quick-guide.html 使用 Picocli 創建命令行應用程序 Picocli 是一個用于構建 Java 命令行應用的強大框架&#xff0c;它簡化了參數解析和幫助消息生成的過程。 下面是如何使用 Picocli 構建簡單命…

windows系統“GameInputRedist.dll”文件丟失或錯誤導致游戲運行異常如何解決?windows系統DLL文件修復方法

GameInputRedist.dll是存放在windows系統中的一個重要dll文件&#xff0c;缺少它可能會造成部分游戲不能正常運行。當你的電腦彈出提示“無法找到GameInputRedist.dll”或“計算機缺少GameInputRedist.dll”等錯誤問題&#xff0c;請不用擔心&#xff0c;我們將深入解析DLL文件…

M4Pro安裝homebrew并基于homebrew安裝MySQL踩坑記錄

系統偏好設置允許安裝任何來源應用&#xff1a;sudo spctl --master-disable 清除提示已損壞軟件的安全隔離&#xff0c;重新安裝&#xff1a; xattr -cr 空格&#xff0b;App路徑 安裝homebrew&#xff1a; /opt/homebrew/Cellar 安裝包目錄 /opt/homebrew/etc 默認運行目…

tmux 中鼠標滾動異常:^[[A和^[[B是什么以及如何解決

tmux 中鼠標滾動異常問題及解決方案 在使用 tmux 時&#xff0c;有時我們會遇到一個現象&#xff1a;當嘗試使用鼠標滾輪滾動窗口內容時&#xff0c;終端中會出現一串類似 ^[[A^[[A 的字符。這讓人困惑&#xff0c;不知道鼠標滾動為什么不起作用&#xff0c;也不清楚這些字符究…

【Vue】mouted、created、computed區別

mouted、created、computed區別 前端vue重構 — computed、watch、組件通信等常用知識整理 created和mouted都是vue生命周期中的鉤子函數&#xff0c;通常用來做一些初始化的工作&#xff0c;比如發送http請求、對組件綁定自定義事件 created&#xff1a;實例創建完后立即調用…

前端如何設計一個回溯用戶操作的方案

同一個項目&#xff0c;為什么我本地無法復現&#xff0c;只有客戶的設備才復現&#xff1f; 如何獲取用戶的操作路徑呢&#xff1f; 兩種方案&#xff1a;埋點和rrweb 埋點就很簡單了&#xff0c;將所有可能操作的節點都進行預埋數據&#xff1b;但埋點簡單并不省心&#xff…

概率論考前一天

判斷是不是分布函數&#xff1a;單調不減&#xff0c;右連續&#xff0c;F負無窮為0&#xff0c; F正無窮為1 判斷是不是密度函數&#xff1a;非負性&#xff08;函數任意地方都大于0&#xff09;&#xff0c;規范&#xff1a;積分為1