【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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…