搭建Node.js服務器

1.基礎HTTP服務器:
  • 添加了路由處理
  • 添加了404錯誤處理
  • 添加了服務器錯誤監聽
2.靜態資源服務器:
  • 使用異步文件操作
  • 支持目錄自動索引(默認加載 index.html)
  • 自動檢測文件類型并設置正確Content-Type
  • 更完善的錯誤處理
3.處理GET請求參數
  • 提供了一個HTML表單用于測試
  • 使用url模塊解析URL和查詢參數
  • 清晰展示接收到的GET參數
4.處理POST請求參數:
  • 提供了一個HTML表單用于測試
  • 使用流的方式處理POST數據
  • 正確解析表單數據
  • 清晰展示接收到的POST參數

一、HTTP模塊

const http = require("http");// 創建服務器實例
const app = http.createServer((req, res) => {// 設置響應頭,指定內容類型和編碼res.setHeader("Content-Type", "text/html;charset=utf-8");// 根據請求路徑返回不同內容switch (req.url) {case "/":res.end("歡迎訪問主頁!");break;case "/about":res.end("這是關于頁面!");break;default:res.statusCode = 404;res.end("404 - 頁面未找到");}
});// 監聽端口并啟動服務器
app.listen(5000, () => {console.log("服務器已啟動!監聽在 http://localhost:5000");
});// 添加錯誤處理
app.on("error", (error) => {console.error(`服務器啟動失敗: ${error.message}`);
});    

二、靜態資源服務器

const http = require("http");
const fs = require("fs").promises;
const path = require("path");// 定義靜態資源目錄
const STATIC_DIR = path.join(__dirname, "static");// 內容類型映射表
const CONTENT_TYPES = {".html": "text/html",".css": "text/css",".js": "text/javascript",".json": "application/json",".png": "image/png",".jpg": "image/jpeg",".gif": "image/gif",".svg": "image/svg+xml",".txt": "text/plain"
};const app = http.createServer(async (req, res) => {try {// 構建文件路徑let filePath = path.join(STATIC_DIR, req.url === "/" ? "index.html" : req.url);// 檢查文件是否存在await fs.access(filePath);// 獲取文件狀態const stat = await fs.stat(filePath);if (stat.isDirectory()) {// 如果是目錄,嘗試默認文件filePath = path.join(filePath, "index.html");await fs.access(filePath);}// 獲取文件擴展名并確定內容類型const extname = path.extname(filePath);const contentType = CONTENT_TYPES[extname] || "application/octet-stream";// 設置響應頭并發送文件內容res.setHeader("Content-Type", contentType);const fileContent = await fs.readFile(filePath);res.end(fileContent);} catch (error) {// 處理錯誤res.statusCode = 404;res.end("404 - 文件未找到");}
});app.listen(3000, () => {console.log("服務器監聽在 http://localhost:3000");
});    

三、服務器獲取get請求參數

在./static下面寫一個index.html頁面,頁面中發送一個get請求

const http = require("http");
const url = require("url");
const qs = require("querystring");const app = http.createServer((req, res) => {res.setHeader("Content-Type", "text/html;charset=utf-8");// 解析URL和查詢參數const parsedUrl = url.parse(req.url, true);const pathname = parsedUrl.pathname;const query = parsedUrl.query;if (pathname === "/") {// 返回表單頁面const formHtml = `<form method="GET" action="/api"><input type="text" name="username" placeholder="用戶名"><input type="password" name="password" placeholder="密碼"><button type="submit">提交</button></form>`;res.end(formHtml);} else if (pathname === "/api") {// 處理GET請求參數res.end(`收到GET請求,參數:${JSON.stringify(query)}`);} else {res.statusCode = 404;res.end("404 - 頁面未找到");}
});app.listen(8888, () => {console.log("服務器已啟動!地址為: http://localhost:8888");
});    

?四、服務器獲取post請求參數

獲取post請求的參數,通過給req綁定事件和end事件,來獲取監聽的參數,data事件一個接收的事件,end事件 當post請求的參數都接收完畢,就出發end事件

const http = require("http");
const qs = require("querystring");const app = http.createServer((req, res) => {res.setHeader("Content-Type", "text/html;charset=utf-8");if (req.url === "/") {// 返回表單頁面const formHtml = `<form method="POST" action="/api"><input type="text" name="username" placeholder="用戶名"><input type="password" name="password" placeholder="密碼"><button type="submit">提交</button></form>`;res.end(formHtml);} else if (req.url === "/api" && req.method === "POST") {// 處理POST請求let body = "";// 監聽data事件,收集數據塊req.on("data", (chunk) => {body += chunk.toString();});// 監聽end事件,數據接收完成req.on("end", () => {// 解析表單數據const formData = qs.parse(body);// 返回處理結果res.end(`收到POST請求,參數:${JSON.stringify(formData)}`);});} else {res.statusCode = 404;res.end("404 - 頁面未找到");}
});app.listen(8888, () => {console.log("服務器已啟動!地址為: http://localhost:8888");
});    

每個步驟的代碼都可以獨立運行,并且包含了必要的注釋以便理解

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

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

相關文章

Linux grep 命令

grep 是 Linux/Unix 系統中用于文本搜索的強大工具&#xff0c;支持基于正則表達式的模式匹配。以下是其詳細用法及實際應用示例&#xff1a; 基本語法 grep [選項] 模式 [文件...]模式&#xff1a;要搜索的字符串或正則表達式。文件&#xff1a;可以是單個文件或多個文件&…

oracle 11g通過rman做備份和還原

ORACLE RMAN增量備份完整恢復測試 1.創建測試環境: 1.1.創建測試表空間 SQL> create tablespace tablespace1 datafile ‘/data/u01/app/oracle/oradata/orcl/tablespace1.dbf’ size 10m; SQL> 1.2.創建測試用戶并指定為默認表空間: SQL> create user user1 iden…

為什么TCP有粘包問題,而UDP沒有

TCP粘包問題源于其面向字節流的設計&#xff0c;而UDP無此問題因其基于數據報的傳輸機制。 &#x1f50d; 一、TCP粘包問題的原因 字節流傳輸特性 TCP將數據視為連續的字節流&#xff0c;而非獨立的消息包。發送端多次寫入的小數據可能被合并為一個TCP段發送&#xff1b;接收端…

ELM:Embodied Understanding of Driving Scenarios

1. ELM 的創新點與核心思路 ELM 的核心在于 “具身理解”(Embodied Understanding),即通過常識與環境交互并進行推理,這一理念適用于自動駕駛車輛、機器人和無人機等多種應用場景。具身智能體(Embodied Agent)需具備四大核心能力:首先,它能夠描述周圍環境,對交通物體的…

實景VR知識科普

實景VR的定義與技術特點 實景VR&#xff0c;即基于真實場景的虛擬現實技術&#xff0c;是通過計算機生成的三維環境&#xff0c;旨在模擬并再現真實世界場景。用戶佩戴VR設備&#xff08;如VR頭盔、手柄等&#xff09;后&#xff0c;能夠沉浸在一個高度仿真的虛擬環境中&#…

CppCon 2016 學習:ITERATOR HAIKU

這組幻燈片講解了 C 中**范圍&#xff08;Ranges&#xff09;和迭代器&#xff08;Iterators&#xff09;**的核心概念&#xff0c;特別是 C14 標準定義的五種迭代器類別&#xff0c;以及范圍的基本使用方式。我幫你理個思路&#xff1a; 1. RANGE-SEQUENCE: 元素范圍&#xf…

開源飛控fmt軟件在環仿真環境搭建

tags: 飛控 fmt開發環境搭建 fmt是國產開源飛控&#xff0c;特點是支持基于模型設計&#xff08;基于simulink仿真&#xff09;&#xff0c;源碼結構目錄較清晰&#xff0c;項目體積較小。 此項目操作系統選擇的是國產實時操作系統rt-thread&#xff0c;也是開源項目。&#…

如何通過AI測試平臺實現自動化缺陷檢測和優化

在數字化轉型加速的今天&#xff0c;軟件質量保證已成為企業競爭力的關鍵要素之一。傳統的手工測試方法面臨著效率低下、成本高昂和覆蓋面有限等挑戰&#xff0c;而AI技術的融入為軟件測試領域帶來了革命性的變化。本文將深入探討如何構建一個完整的AI測試平臺&#xff0c;實現…

使用JeecgBoot配置

Jeecg 使用方法 本文以在環境配置好的前提下進行講解 如果不會配置環境 可在billbill網站的Jeecg官網搜索環境配置 第一步 打開redis&#xff0c;redis是一個服務&#xff0c;需要用命令行打開 且命令行不能關 不能實現一勞永逸效果 每次關閉都得重新打開一次。 第二步 啟動j…

NodeJS:版本及對應時間并對應的npm版本

versionltsrelease dateenginenpmnode下載更新日志文檔Node.js 24.0.1?2025-05-0813.61--下載更新日志文檔Node.js 22.12.0?2024-12-03---下載更新日志文檔Node.js 21.2.0 2023-11-1411.8.172.1710.2.3120下載更新日志文檔Node.js 20.10.0?2023-11-2211.3.244.810.2.3115下載…

UI前端大數據處理:應對海量數據的挑戰與策略

hello寶子們...我們是艾斯視覺擅長ui設計、前端開發、數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩! 在數字化轉型的深水區&#xff0c;全球每日產生的數據量已突破 500EB&#xff0c;相當于 10 億…

對微服務的了解

微服務是一種架構風格&#xff0c;我們可以把應用程序劃分為一組小型的、松散耦合的服務&#xff0c; 每個服務都運行在自己的進程中&#xff0c;并通過輕量級的通信機制進行通信&#xff0c; 每個服務都是獨立部署、獨立擴展、獨立更新的&#xff0c;從而提高了應用程序的可伸…

計算機視覺生物啟發視覺算法:如何模擬人眼與大腦?

計算機視覺生物啟發視覺算法:如何模擬人眼與大腦? 一、前言二、人眼與大腦視覺系統基礎概念?2.1 人眼的生理結構與功能?2.2 大腦視覺皮層的信息處理機制?三、生物啟發視覺算法的核心技術?3.1 視網膜啟發的特征提取算法?3.2 視覺皮層啟發的分層特征學習算法?3.3 注意力機…

stm32使用定時器功能之高精度定時(微秒級)、輸入捕獲以及超聲波測距

一、定時器功能之高精度定時&#xff08;微秒級&#xff09; 我們常用的延時函數中無論是HAL_Delay還是vTaskDelay()函數都是毫秒級的定時&#xff0c;我們可以借助定時器實現一個微秒級更高精度的延時函數。這個定時器不會影響FreeRtos的任務切換 這里就是用定時器的計數功能…

Git常用命令摘要

寫這篇博文的目的只是簡單的給自己及團隊的日常工作中需要用到的git命令作個匯總&#xff0c;這樣平時只需要查閱這篇文章就夠了&#xff0c;不用到處查找。如果能給有需要的朋友一點點的幫助&#xff0c;那也算是意外之喜吧。 一、基礎配置 # 設置用戶名和郵箱&#xff08;首…

ubuntu 22.04 安裝部署kibana 7.10.0詳細教程

安裝部署kibana 7.10.0詳細教程 下載并安裝二、修改kibana.yml文件三、性能配置四、啟動服務驗證五、安裝啟動常見問題 【背景】 整個elk安裝是基于ubuntu 22.04和jdk 11環境。kibana均采用 *.deb方式安裝&#xff0c;需要服務器能聯網。ubuntu 22.04 安裝部署elk(elasticsearc…

nfs 服務器的搭建

nfs 服務器的搭建 1.配置yum源 mkdir /etc/yum.repos.d/bak mv /etc/yum.repo.d/*.repo /etc/yum.repos.d/bak/ curl -o /etc/yum.repos.d/centos.repo http://10.26.210.101/centos/centos.repo # 外網 curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.c…

Yii2 基礎版實現 Token 認證 API 服務的完整框架方案

以下是一個基于 Yii2 基礎版實現 Token 認證 API 服務的完整框架方案&#xff0c;包含 JWT 實現和完整代碼&#xff1a; 1. 環境準備 composer create-project --prefer-dist yiisoft/yii2-app-basic yii2-api cd yii2-api2. 安裝必要擴展 composer require firebase/php-jw…

主流版本控制工具Git vs Perforce P4:架構模式、性能、大文件管理及分支管理對比詳解

Git和Perforce P4是兩個強大的源代碼管理工具&#xff0c;各有其獨特的功能優勢與適用場景。 本文中&#xff0c;Perforce中國授權合作伙伴-龍智將從架構設計、性能表現、文件管理及分支策略等維度&#xff0c;為您詳細解析兩者的關鍵差異&#xff0c;幫助您根據團隊需求&…

文件系統2(Linux下)

1 掛載分區 文件系統1中已經知道了能夠根據inode號在指定分區找文件了&#xff0c;也已經能根據目錄文件內容&#xff0c;找指定的inode了&#xff0c;在指定的分區內&#xff0c;就可以對文件進行操作了。但是還有幾個問題&#xff0c;那就是inode是不能跨分區的&#xff0c;…