【Node.js從 0 到 1:入門實戰與項目驅動】1.3 Node.js 的應用場景(附案例與代碼實現)

文章目錄

  • 1.3 Node.js 的應用場景(附案例與代碼實現)
    • 1.3 Node.js 的應用場景(附案例與代碼實現)
      • 一、Web 服務器開發
      • 二、API 開發
      • 三、命令行工具(CLI)開發
      • 四、實時應用開發
      • 小結

1.3 Node.js 的應用場景(附案例與代碼實現)

1.3 Node.js 的應用場景(附案例與代碼實現)

Node.js 憑借異步非阻塞 I/O事件驅動的特性,在多個領域展現出高效性和靈活性。以下結合具體案例和可運行代碼,詳細介紹其典型應用場景:

一、Web 服務器開發

Node.js 原生支持 HTTP 模塊,可直接構建輕量級 Web 服務器,尤其適合處理高并發的靜態資源請求(如 HTML、CSS、圖片等)。

  • 優勢

    • 單線程模型減少內存開銷,非阻塞 I/O 可同時處理 thousands 級并發連接(無需為每個請求創建新線程)。
    • 配合 express 等框架,可快速擴展為支持路由、中間件的完整服務器。
  • 案例:靜態文件服務器

    • 使用 Node.js 原生 http 模塊和 fs 模塊,實現一個簡單的靜態文件服務器,根據請求路徑返回對應文件。
    • server.js
      // server.js
      const http = require('http');
      const fs = require('fs');
      const path = require('path');
      // 創建 HTTP 服務器const server = http.createServer((req, res) => {// 解析請求路徑(默認返回 index.html)const filePath = req.url === '/' ? './public/index.html' : `./public${req.url}`;const extname = path.extname(filePath); // 獲取文件擴展名// 設置 Content-Type(簡單處理常見類型)const contentType = {'.html': 'text/html','.css': 'text/css','.js': 'text/javascript','.png': 'image/png'} [extname] || 'text/plain';// 讀取文件并返回fs.readFile(filePath, (err, data) => {if (err) {// 處理 404 錯誤res.writeHead(404, { 'Content-Type': 'text/html' });res.end('<h1>404 Not Found</h1>');} else {res.writeHead(200, { 'Content-Type': contentType });res.end(data); // 返回文件內容}});
      });// 啟動服務器const PORT = 3000;
      server.listen(PORT, () => {console.log(`服務器運行在 http://localhost:${PORT}`);
      });
      
    • index.html
      // index.html
      <!-- public/index.html -->
      <!DOCTYPE html>
      <html>
      <head><meta charset="UTF-8"> <!-- 添加這行設置字符編碼為 UTF-8 --><title>Node.js 靜態服務器</title><link rel="stylesheet" href="style.css">
      </head>
      <body>
      <div class="container"><h1>Hello Node.js Server</h1><p>這是一個由 Node.js 原生模塊構建的靜態文件服務器</p>
      </div>
      </body>
      </html>
      
    • style.css
      /* public/style.css */
      body {font-family: Arial, sans-serif;max-width: 800px;margin: 0 auto;padding: 20px;background-color: #f0f2f5;
      }h1 {color: #1a73e8;border-bottom: 2px solid #eee;padding-bottom: 10px;
      }p {line-height: 1.6;color: #333;
      }.container {background-color: white;padding: 30px;border-radius: 8px;box-shadow: 0 2px 4px rgba(0,0,0,0.1);
      }
      
  • 運行步驟

      1. 創建目錄結構:
      project/
      ├── server.js
      └── public/├── index.html├── style.css└── image.png
      
      1. public/index.html 中寫入簡單內容(如 <h1>Hello Node.js Server</h1>)。
      1. 執行命令:node server.js
      1. 訪問 http://localhost:3000,可看到 index.html 內容;訪問 http://localhost:3000/style.css 可返回樣式文件。
        在這里插入圖片描述
        在這里插入圖片描述

二、API 開發

Node.js 是構建 RESTful API 或 GraphQL 接口的熱門選擇,尤其適合需要頻繁與數據庫、第三方服務交互的場景。

  • GraphQL 是一種用于 API 開發的查詢語言,與傳統 RESTful API 不同,它 允許客戶端精確指定需要獲取的數據,避免了過度獲取或獲取不足的問題

  • 簡單說,GraphQL 讓客戶端 “說了算”,想要什么數據就明確告訴服務器,避免了數據浪費或不夠用的問題,尤其適合前端需求多變的場景。

  • 優勢

    • 異步編程模型完美適配 API 中的 “等待數據返回” 操作(如數據庫查詢、網絡請求),避免阻塞。
    • 豐富的框架(如 ExpressKoa)和庫(如 MongooseSequelize)簡化開發。
    • 案例:RESTful 用戶 API
      使用 Express 框架和內存數組模擬數據庫,實現用戶信息的增刪改查(CRUD)接口。
    • api.js
      // api.js
      const express = require('express');
      const app = express();
      app.use(express.json());// 模擬數據庫(用戶數組)
      let users = [{ id: 1, name: 'Alice', age: 25 },{ id: 2, name: 'Bob', age: 30 }
      ];// 新增:處理根路徑請求
      app.get('/', (req, res) => {res.send(`<h1>用戶API服務</h1><p>可用接口:</p><ul><li>GET /api/users - 獲取所有用戶</li><li>GET /api/users/:id - 獲取單個用戶</li><li>POST /api/users - 創建用戶(需JSON請求體)</li><li>PUT /api/users/:id - 更新用戶</li><li>DELETE /api/users/:id - 刪除用戶</li></ul>`);
      });// 以下是原有的接口(保持不變)
      app.get('/api/users', (req, res) => {res.json(users);
      });app.get('/api/users/:id', (req, res) => {const user = users.find(u => u.id === parseInt(req.params.id));if (!user) return res.status(404).json({ message: '用戶不存在' });res.json(user);
      });app.post('/api/users', (req, res) => {const newUser = {id: users.length + 1,name: req.body.name,age: req.body.age};users.push(newUser);res.status(201).json(newUser);
      });app.put('/api/users/:id', (req, res) => {const user = users.find(u => u.id === parseInt(req.params.id));if (!user) return res.status(404).json({ message: '用戶不存在' });user.name = req.body.name || user.name;user.age = req.body.age || user.age;res.json(user);
      });app.delete('/api/users/:id', (req, res) => {const userIndex = users.findIndex(u => u.id === parseInt(req.params.id));if (userIndex === -1) return res.status(404).json({ message: '用戶不存在' });users.splice(userIndex, 1);res.json({ message: '用戶已刪除' });
      });app.listen(3000, () => {console.log('API 服務器運行在 http://localhost:3000');
      });
      
  • 運行步驟

      1. 安裝依賴:npm install express
      1. 執行命令:node api.js
      1. 使用工具(如 Postman、curl)測試接口:
        在這里插入圖片描述
  • GET ``http://localhost:3000/api/users → 獲取所有用戶。
    在這里插入圖片描述

  • POST ``http://localhost:3000/api/users(請求體:{ "name": "Charlie", "age": 28 })→ 創建用戶。

三、命令行工具(CLI)開發

Node.js 可開發跨平臺(Windows/macOS/Linux)的命令行工具,用于自動化腳本、項目腳手架等場景。

  • 優勢

    • 借助 commander(命令解析)、inquirer(交互式提問)等庫,快速實現命令行交互。
    • 通過 npm 發布后,用戶可全局安裝(npm install -g)并直接調用。
  • 案例:項目初始化工具

    • 開發一個簡單的 CLI 工具,通過命令快速創建前端項目目錄(如 srcpublic 文件夾及基礎文件)。
    • cli.js
      #!/usr/bin/env node  // 聲明為 Node 可執行文件
      const { program } = require('commander');
      const fs = require('fs');
      const path = require('path');// 定義命令:init <項目名>
      program.command('init <projectName>').description('創建新項目').action((projectName) => {// 創建項目目錄const projectPath = path.join(process.cwd(), projectName);if (fs.existsSync(projectPath)) {console.error(`錯誤:目錄 ${projectName} 已存在`);return;}fs.mkdirSync(projectPath);// 創建子目錄和文件const dirs = ['src', 'public'];dirs.forEach(dir => {fs.mkdirSync(path.join(projectPath, dir));});// 創建 index.htmlfs.writeFileSync(path.join(projectPath, 'public/index.html'),'<!DOCTYPE html>\n<html>\n<head>\n<title>My Project</title>\n</head>\n<body></body>\n</html>');console.log(`項目 ${projectName} 創建成功!路徑:${projectPath}`);});// 解析命令行參數
      program.parse(process.argv);
      
  • 運行步驟

      1. 安裝依賴:npm install commander
      1. package.json 中添加配置(使工具可全局調用):
      {"name": "my-cli","version": "1.0.0","bin": {"mycli": "./cli.js"},"dependencies": {"commander": "^11.0.0"}
      }
      
      1. 本地鏈接工具:npm link(相當于全局安裝)。
      1. 執行命令:node cli.js init my-project → 自動創建 my-project 目錄及結構。
        在這里插入圖片描述

四、實時應用開發

Node.js 是實時通信應用的首選技術,其事件驅動模型可高效處理低延遲、高并發的雙向通信(如聊天室、實時協作工具)。

  • 優勢

    • 基于 WebSocket 協議(全雙工通信),配合 wsSocket.io 庫,實現服務器與客戶端的實時數據推送。

    • 案例:簡易 WebSocket 聊天室

      • 使用 ws 庫實現一個實時聊天室,支持多用戶同時發送和接收消息。
    • websocket-server.js

      // websocket-server.js
      const WebSocket = require('ws');
      const wss = new WebSocket.Server({ port: 8080 }); // 創建 WebSocket 服務器// 存儲所有連接的客戶端
      const clients = new Set();// 監聽客戶端連接
      wss.on('connection', (ws) => {console.log('新客戶端連接');clients.add(ws);// 監聽客戶端消息ws.on('message', (data) => {const message = data.toString(); // 接收消息(字符串格式)console.log(\`收到消息:\${message}\`);// 廣播消息給所有客戶端(包括發送者)clients.forEach(client => {if (client.readyState === WebSocket.OPEN) {client.send(message); // 轉發消息}});});// 監聽客戶端斷開連接ws.on('close', () => {console.log('客戶端斷開連接');clients.delete(ws);});
      });console.log('WebSocket 聊天室運行在 ws://localhost:8080');
      
    • 客戶端頁面(client.html)

      <!-- client.html --><!DOCTYPE html>
      <html>
      <head><meta charset="UTF-8"> <!-- 添加這行設置字符編碼為 UTF-8 --><title>Node.js 靜態服務器</title><link rel="stylesheet" href="style.css">
      </head>
      <body><input type="text" id="messageInput" placeholder="輸入消息">
      <button onclick="sendMessage()">發送</button>
      <div id="messages"></div>
      <script>// 連接 WebSocket 服務器const ws = new WebSocket('ws://localhost:8080');// 接收服務器消息ws.onmessage = (event) => {const messagesDiv = document.getElementById('messages');messagesDiv.innerHTML += `<p>${event.data}</p>`;};// 發送消息到服務器function sendMessage() {const input = document.getElementById('messageInput');const message = input.value;if (message) {ws.send(message);input.value = '';}}</script>
      </body>
      </html>
      
  • 運行步驟

      1. 安裝依賴:npm install ws
      1. 啟動服務器:node websocket-server.js
      1. 用瀏覽器打開多個 client.html 頁面,在輸入框中發送消息,所有頁面會實時顯示消息內容。
        在這里插入圖片描述
        在這里插入圖片描述

小結

Node.js 的應用場景遠不止上述幾類,還包括桌面應用開發(如 Electron)、數據流處理(如日志分析)、微服務架構等。

  • 其核心優勢在于將 JavaScript 的靈活性與異步 I/O 結合,使開發者能高效應對各類場景,尤其是 I/O 密集型任務。
  • 通過豐富的生態(npm 包、框架),Node.js 進一步降低了開發門檻,成為全棧開發的重要工具。

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

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

相關文章

No time to train! Training-Free Reference-Based Instance Segmentation之論文閱讀

摘要 圖像分割模型的性能歷來受到大規模標注數據收集成本高昂的制約。Segment Anything Model&#xff08;SAM&#xff09;通過一種可提示、與語義無關的分割范式緩解了這一根本問題&#xff0c;但在處理新圖像時&#xff0c;仍然需要手動提供視覺提示或依賴復雜的領域相關提示…

本地文件夾與 GitHub 遠程倉庫綁定并進行日常操作的完整命令流程

以下是將本地文件夾與 GitHub 遠程倉庫綁定并進行日常操作的完整命令流程&#xff0c;特別針對你的需求&#xff08;忽略數據集、偏好使用 rebase 保持主分支整潔&#xff09;進行了優化&#xff1a; 一、初始設置&#xff08;首次綁定&#xff09;在本地項目文件夾初始化 Git …

windows10 ubuntu 24.04 雙系統 安裝教程

準備windows安裝包解壓到u盤中作為啟動盤準備ubuntu安裝包https://ubuntu.com/download/desktop/thank-you?version24.04.3&architectureamd64<strue解壓到u盤中作為啟動盤準備磁盤分區安裝windows操作系統安裝disk geniusWindows 三個NTFS的分區System: windows操作系…

騰訊前端面試模擬詳解

以下是騰訊及騰訊音樂娛樂&#xff08;TME&#xff09;前端崗位高頻手撕題目詳解&#xff0c;結合真題及考察要點整理&#xff0c;覆蓋面試核心考點&#xff1a;?? 一、核心手撕題&#xff08;騰訊/TME 必考&#xff09; 1. Promise 并發控制&#xff08;90%場次出現&#xf…

微軟將于 10 月停止混合 Exchange 中的共享 EWS 訪問

使用 Exchange 混合部署的組織應為未來幾個月即將生效的新變化做好準備。微軟已宣布&#xff0c;自 2025 年 8 月起&#xff0c;將在某些混合環境中暫時阻止使用 Exchange Online 共享服務主體的 Exchange Web 服務 (EWS) 流量。 此項變更主要影響使用“豐富共存”功能的組織&a…

STM32CubeMX + HAL 庫:用硬件IIC接口實現AT24C02 EEPROM芯片的讀寫操作

1 概述1.1 實驗目的本實驗旨在通過 STM32 微控制器的硬件 IC 接口&#xff0c;對 AT24C02 外部 EEPROM 存儲芯片 進行讀寫操作。實驗演示了芯片地址配置、單字節/多字節讀寫、跨頁寫入&#xff08;Page Write&#xff09;功能。并提供完整的驅動代碼&#xff0c;幫助讀者深入理…

基于Android的音樂播放器/基于android studio的音樂系統/音樂管理系統

原生APP安卓開發設計之基于Android的音樂播放器/音樂系統/音樂管理系統[springboot]android studio

OmniHuman:字節推出的AI項目,支持單張照片生成逼真全身動態視頻

本文轉載自&#xff1a;OmniHuman&#xff1a;字節推出的AI項目&#xff0c;支持單張照片生成逼真全身動態視頻 - Hello123。 ** 一、核心產品定位 OmniHuman 是字節跳動研發的 AI 視頻生成技術&#xff0c;通過單張圖像&#xff08;真人 / 動漫 / 3D 角色&#xff09;和音頻…

5種無需USB線將照片從手機傳輸到筆記本電腦的方法

Android手機和平板電腦非常適合查看照片&#xff0c;因為這些移動設備可以隨身攜帶&#xff0c;隨時隨地查看文件。然而&#xff0c;移動設備的存儲空間非常有限&#xff0c;而且很容易丟失或損壞。因此&#xff0c;將重要的照片從Android設備傳輸到電腦進行備份是非常明智的決…

2025年滲透測試面試題總結-14(題目+回答)

安全領域各種資源&#xff0c;學習文檔&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具&#xff0c;歡迎關注。 目錄 九十一、Android APP 逆向分析步驟 九十二、SQL注入分類 九十三、SQL注入防御 九十四、序列化與反序列化…

PG靶機 - Flu

一、初步偵察與服務識別 1.1 端口掃描 首先對目標主機 192.168.122.41 進行全端口掃描&#xff0c;以發現其上開放的網絡服務。 sudo nmap 192.168.122.41 -p- --min-rate5000 -A圖1: Nmap掃描結果&#xff0c;顯示開放22, 8090, 和 8091端口 掃描結果顯示&#xff0c;目標開放…

【Leetcode】隨筆

文章目錄題目一&#xff1a;路徑總和 II&#xff08;LeetCode 113&#xff09;題目分析&#xff1a;解題思路&#xff1a;示例代碼&#xff1a;代碼解析&#xff1a;題目二&#xff1a;顏色分類&#xff08;LeetCode 75&#xff09;題目分析&#xff1a;解題思路&#xff1a;示…

深入 FastMCP 源碼:認識 tool()、resource() 和 prompt() 裝飾器

在使用 FastMCP 開發 MCP 服務器時經常會用到 mcp.tool() 等裝飾器。雖然它們用起來很簡單&#xff0c;但當作黑匣子總讓人感覺"不得勁"。接下來我們將深入相關的源碼實現&#xff0c;別擔心&#xff0c;不會鉆沒有意義的“兔子洞”&#xff0c;你可以通過這篇文章了…

Spring Boot 2.0 升級至 3.5 JDK 1.8 升級至 17 全面指南

一、版本升級背景升級動機 Spring Boot 2.0 到 3.5 的重大更新&#xff08;如Jakarta EE 9包路徑變更、GraalVM支持等&#xff09;JDK 1.8 到 17 的語言特性升級&#xff08;如sealed class、record等&#xff09;安全性與性能優化需求升級目標 兼容性驗證依賴庫版本適配代碼兼…

級數學習筆記

級數學習筆記 一、數學基礎 1. 數項級數&#xff08;Number Series&#xff09; 數項級數是指形如&#xff1a; ∑(n1 to ∞) a? a? a? a? ...的無窮和。 1.1 收斂性判別法 比較判別法比值判別法根值判別法積分判別法萊布尼茨判別法&#xff08;交錯級數&#xff09; 2…

Linux811 YUM;SHELL:if else fi,for

vsftpdok [rootweb ~]# vim vsftpdok.sh 您在 /var/spool/mail/root 中有新郵件 [rootweb ~]# cat vsftpdok.sh rpm -ql vsftpd >/dev/null 2>&1 if [ $? -eq 0 ];then echo "OK" else yum install vsftpd -y if [ $? -eq 0 ];then echo "install o…

運維學習Day20——MariaDB數據庫管理

文章目錄MariaDB 數據庫管理介紹 MariaDB數據庫介紹數據庫種類關系數據庫MariaDB 介紹部署 MariaDB安裝 MariaDB加固 MariaDB連接 MariaDB配置 MariaDBMariaDB 中 SQL描述 SQL連接數據庫數據庫操作查詢數據庫列表使用數據庫創建數據庫刪除數據庫表操作環境準備查詢表查詢表列表…

itertools:迭代器函數

文章目錄一、合并和分解迭代器1、chain&#xff1a;首尾相接2、zip / zip_longest&#xff1a;對齊取數3、islice&#xff1a;切片4、tee&#xff1a;分裂二、轉換輸入1、map / starmap&#xff1a;函數映射三、生成新值1、count&#xff1a;生成連續整數2、repeat&#xff1a;…

【AI論文】序列標注任務廣義化研究(SFT廣義化):基于獎勵修正的強化學習視角

摘要&#xff1a;我們針對大語言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;的監督微調&#xff08;Supervised Fine-Tuning&#xff0c;SFT&#xff09;提出了一種簡單但具有理論依據的改進方法&#xff0c;以解決其與強化學習&#xff08;Reinforcemen…

(已解決)Mac 終端上配置代理

說明&#xff1a;為了便于理解&#xff0c;本文描述略顯“抽象”與“潦草”&#xff0c;為了過審&#xff0c;僅供學習交流使用。&#x1f680; 簡潔流程版啟動工具 點擊圖標&#xff0c;復制它給出的終端命令將這段內容粘貼進你的配置文件中&#xff08;~/.zshrc 或 ~/.bash_p…