原生 Node 开发 Web 服务器

一、创建基本的 HTTP 服务器

使用 http 模块创建 Web 服务器

const http = require("http");// 创建服务器const server = http.createServer((req, res) => {// 设置响应头res.writeHead(200, { "Content-Type": "text/plain" });// 发送响应内容res.end("Hello, World!");});// 监听端口server.listen(3000, () => {console.log("Server running:http://127.0.0.1:3000");});

二、处理不同的 HTTP 请求方法

1. 创建 index.html

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Demo</title></head><body><h1>你好啊</h1><form action="./" method="post"><input type="text" name="username" /><input type="text" name="age" /><input type="submit" value="提交" /></form></body></html>

2. 编辑 index.js

const http = require("http");const fs = require("fs");const server = http.createServer((req, res) => {if (req.method === "GET") {// 处理GET请求res.writeHead(200, { "Content-Type": "text/html" });fs.readFile("./index.html", "utf8", (err, data) => {if (!err) {res.end(data);}});} else if (req.method === "POST") {// 处理POST请求let data = "";req.on("data", (chunk) => {data += chunk;});req.on("end", () => {res.writeHead(200, { "Content-Type": "text/plain" });res.end(`This is a POST request. Data received: ${data}`);});} else {// 处理其他请求方法res.writeHead(405, { "Content-Type": "text/plain" });res.end("Method Not Allowed");}});// 监听端口server.listen(3000, () => {console.log("Server running:http://127.0.0.1:3000");});

三、路由处理

const http = require("http");const url = require("url");const server = http.createServer((req, res) => {// 解析URLconst parsedUrl = url.parse(req.url, true);const pathname = parsedUrl.pathname;if (pathname === "/") {// 处理根路径请求res.writeHead(200, { "Content-Type": "text/plain" });res.end("This is the home page");} else if (pathname === "/about") {// 处理/about路径请求res.writeHead(200, { "Content-Type": "text/plain" });res.end("This is the about page");} else {// 处理其他路径请求res.writeHead(404, { "Content-Type": "text/plain" });res.end("Page Not Found");}});server.listen(3000, () => {console.log("Server running on port 3000");});

四、静态文件服务

可以使用`fs`模块来实现静态文件的服务,例如返回 HTML、CSS、JavaScript 等文件。

const http = require("http");const fs = require("fs");const path = require("path");const url = require("url");const server = http.createServer((req, res) => {// 解析URLconst parsedUrl = url.parse(req.url, true);const pathname = parsedUrl.pathname;// 处理根路径请求,返回index.html文件if (pathname === "/") {const filePath = path.join(__dirname, "index.html");fs.readFile(filePath, (err, data) => {if (err) {res.writeHead(500, { "Content-Type": "text/plain" });res.end("Internal Server Error");} else {res.writeHead(200, { "Content-Type": "text/html" });res.end(data);}});// 处理其他静态文件请求} else {const filePath = path.join(__dirname, pathname);// fs.stat 判断路径对应的是否为文件fs.stat(filePath, (err, stats) => {if (err) {res.writeHead(404, { "Content-Type": "text/plain" });res.end("Page Not Found");} else if (stats.isFile()) {// 如果是文件,则读取并返回文件内容fs.readFile(filePath, (err, data) => {if (err) {res.writeHead(500, { "Content-Type": "text/plain" });res.end("Internal Server Error");} else {// 根据文件扩展名设置正确的Content-Typeconst extname = path.extname(filePath);let contentType = "text/plain";if (extname === ".html") {contentType = "text/html";} else if (extname === ".css") {contentType = "text/css";} else if (extname === ".js") {contentType = "application/javascript";}res.writeHead(200, { "Content-Type": contentType });res.end(data);}});} else {res.writeHead(404, { "Content-Type": "text/plain" });res.end("Page Not Found");}});}});server.listen(3000, () => {console.log("Server running on port 3000");});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/893849.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣【98. 验证二叉搜索树】Java题解(容易写错的题)

二叉搜索树的中序遍历是有序数组&#xff08;因为对于数组某个元素&#xff0c;左边是它的左子树而右边是它的右子树&#xff0c;显然二叉树搜索树左子树小于它&#xff0c;右子树大于它&#xff09;&#xff0c;所以可以直接中序遍历然后判断是否有序来判断是否是二叉搜索树。…

MiniHack:为强化学习研究提供丰富而复杂的环境

人工智能咨询培训老师叶梓 转载标明出处 想要掌握如何将大模型的力量发挥到极致吗&#xff1f;叶老师带您深入了解 Llama Factory —— 一款革命性的大模型微调工具&#xff08;限时免费&#xff09;。 1小时实战课程&#xff0c;您将学习到如何轻松上手并有效利用 Llama Facto…

构建自定义 AI 模型服务:集成到 Spring AI 处理特定任务

生成式 AI 的发展为解决各种特定任务提供了强大的支持。然而&#xff0c;许多场景需要定制化的 AI 模型&#xff0c;例如企业内的专属知识库问答、图像处理任务、或特定行业的语音识别。将自定义的 AI 模型集成到 Spring AI 中&#xff0c;可以利用其模块化、配置管理和工具支持…

从AD的原理图自动提取引脚网络的小工具

这里跟大家分享一个我自己写的小软件&#xff0c;实现从AD的原理图里自动找出网络名称和引脚的对应。存成文本方便后续做表格或是使用简单行列编辑生成引脚约束文件&#xff08;如.XDC .UCF .TCL等&#xff09;。 我们在FPGA设计中需要引脚锁定文件&#xff0c;就是指示TOP层…

kubernetes 核心技术-调度器

在 Kubernetes 集群中&#xff0c;调度器扮演着至关重要的角色。它负责决定将哪些 Pod 放置到哪些节点上运行&#xff0c;以确保集群资源得到高效利用的同时满足各种约束条件。调度器不仅要考虑 CPU 和内存等基本资源的需求&#xff0c;还需要处理诸如亲和性、反亲和性、污点与…

ultralytics 是什么?

ultralytics 是一个用于计算机视觉任务的 Python 库&#xff0c;专注于提供高效、易用的目标检测、实例分割和图像分类工具。它最著名的功能是实现 YOLO&#xff08;You Only Look Once&#xff09; 系列模型&#xff0c;特别是最新的 YOLOv8。 1. YOLO 是什么&#xff1f; YO…

MySQL分表自动化创建的实现方案(存储过程、事件调度器)

《MySQL 新年度自动分表创建项目方案》 一、项目目的 在数据库应用场景中&#xff0c;随着数据量的不断增长&#xff0c;单表存储数据可能会面临性能瓶颈&#xff0c;例如查询、插入、更新等操作的效率会逐渐降低。分表是一种有效的优化策略&#xff0c;它将数据分散存储在多…

Vue 3 中的标签 ref 与 defineExpose:模板引用与组件暴露

在 Vue 3 中&#xff0c;ref 不仅可以用于创建响应式数据&#xff0c;还可以用于获取 DOM 节点或组件实例。通过 ref&#xff0c;我们可以直接访问模板中的元素或组件&#xff0c;并在需要时操作它们。此外&#xff0c;defineExpose 用于在 <script setup> 语法中显式暴露…

Docker 国内镜像源

目录 概述 步骤 参考资料 概述 自 2024-06-06 开始&#xff0c;阿里&#xff0c;腾讯、中科大等国内的 Docker Hub 镜像加速器相继停止服务&#xff0c;总结了网友整理出来一些其他国内 Docker Hub 镜像源&#xff0c;经过测试可以使用。 步骤 配置 Docker 守护程序 修改…

HTML5使用favicon.ico图标

目录 1. 使用favicon.ico图标 1. 使用favicon.ico图标 favicon.ico一般用于作为网站标志&#xff0c;它显示在浏览器的地址栏或者标签上 制作favicon图标 选择一个png转ico的在线网站&#xff0c;这里以https://www.bitbug.net/为例。上传图片&#xff0c;目标尺寸选择48x48&a…

xarray转换nc文件经度范围:0-360更改为-180-180

原文见https://blog.csdn.net/weixin_44237337/article/details/119707332&#xff0c;因为觉得很实用就转载一下。 lon_name longitude #你的nc文件中经度的命名 ds[longitude_adjusted] xr.where(ds[lon_name] > 180,ds[lon_name] - 360,ds[lon_name]) ds (ds.swap_d…

834 数据结构(自用)

一.绪论 1.数据结构基本概念 1.基本术语: 数据元素&#xff1a;数据基本单位。 数据项&#xff1a;众多数据项组成一个数据元素&#xff0c;不可分割的最小单位。 数据对象&#xff1a;具有相同性质的数据元素集合。 数据结构&#xff1a;相互之间存在一种或多种特定关系…

【C++动态规划 网格】2328. 网格图中递增路径的数目|2001

本文涉及知识点 C动态规划 LeetCode2328. 网格图中递增路径的数目 给你一个 m x n 的整数网格图 grid &#xff0c;你可以从一个格子移动到 4 个方向相邻的任意一个格子。 请你返回在网格图中从 任意 格子出发&#xff0c;达到 任意 格子&#xff0c;且路径中的数字是 严格递…

fatal error C1083: ޷[特殊字符]ļ: openssl/opensslv.h: No such file or directory

一、环境 1. Visual Studio 2017 2. edk2&#xff1a;202305 3. Python&#xff1a;3.11.4 二、 fatal error C1083: ޷&#xbfab0;ļ: openssl/opensslv.h: No such file or directory 上图出现这个警告&#xff0c;不用管。 出现Done&#xff0c;说明编译成功。 执行上…

组件框架漏洞

一.基础概念 1.组件 定义&#xff1a;组件是软件开发中具有特定功能或特性的可重用部件或模块&#xff0c;能独立使用或集成到更大系统。 类型 前端 UI 组件&#xff1a;像按钮、下拉菜单、导航栏等&#xff0c;负责构建用户界面&#xff0c;提升用户交互体验。例如在电商 AP…

性能测试丨JVM 性能数据采集

什么是JVM性能数据采集&#xff1f; JVM性能数据采集是指通过一些工具和技术采集与Java虚拟机相关的性能数据。这些数据包括但不限于内存使用、CPU使用、垃圾回收&#xff08;GC&#xff09;行为、线程活动等。合理地分析这些数据&#xff0c;可以帮助我们找出系统的瓶颈&…

隐藏字符造成的linux命令执行失败(非常难绷)

隐藏字符问题发生情景 事情是这样的&#xff0c;为了方便主机和虚拟机之间数据的传输&#xff0c;我打算建一个共享文件夹。由于我选择的是手动挂载&#xff0c;在VirtualBox 中创建好共享文件夹后&#xff0c;我着手打开Ubuntu&#xff0c;想将这个共享文件夹挂载到我的家目录…

[ Spring ] Spring Cloud Alibaba Aliyun OSS 2025

文章目录 Declare PluginsIntroduce DenpendenciesOSS ApplicationOSS ConfigOSS Controller Declare Plugins pluginManagement {repositories {gradlePluginPortal()google()mavenCentral()} }dependencyResolutionManagement {repositoriesMode RepositoriesMode.PREFER_S…

C/C++ 虚函数

虚函数的定义 虚函数是指在基类内部声明的成员函数前面添加关键字 virtual 指明的函数虚函数存在的意义是为了实现多态&#xff0c;让派生类能够重写(override)其基类的成员函数派生类重写基类的虚函数时&#xff0c;可以添加 virtual 关键字&#xff0c;但不是必须这么做虚函…

爬虫基础之爬取某基金网站+数据分析

声明: 本案例仅供学习参考使用&#xff0c;任何不法的活动均与本作者无关 网站:天天基金网(1234567.com.cn) --首批独立基金销售机构-- 东方财富网旗下基金平台! 本案例所需要的模块: 1.requests 2.re(内置) 3.pandas 4.pyecharts 其他均需要 pip install 模块名 爬取步骤: …