Node.js自学速通---- 24-8-22 22-44

目录

  • 一、安装 Node.js
  • 二、Node.js 的基本概念
  • 三、创建第一个 Node.js 应用
  • 四、使用模块
  • 五、创建 HTTP 服务器
  • 六、案例:文件服务器

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,可以让 JavaScript 在服务器端运行。

一、安装 Node.js

  1. 打开浏览器,访问 Node.js 官方网站(https://nodejs.org/)。
  2. 在官网首页,你可以看到“LTS”(长期支持版本)和“Current”(当前版本)两个选项。一般来说,选择 LTS 版本会更加稳定。
  3. 根据你的操作系统(Windows、macOS 或 Linux),下载相应的安装程序。
  4. 运行安装程序,按照提示完成安装。

安装完成后,可以在命令提示符或终端中输入以下命令来检查 Node.js 是否安装成功:

node -v

如果能正确显示 Node.js 和 npm(Node.js 的包管理工具)的版本号,说明安装成功。

二、Node.js 的基本概念

  1. 模块系统

    • Node.js 使用 CommonJS 模块规范,允许你将代码拆分成多个模块,以便更好地组织和管理代码。
    • 一个模块可以通过 require 函数引入其他模块,并通过 module.exportsexports 对象导出自己的功能。
  2. 事件驱动和非阻塞 I/O

    • Node.js 是事件驱动的,它使用异步编程模型,通过回调函数或 Promise 来处理异步操作。
    • Node.js 的非阻塞 I/O 使得它能够在处理大量并发连接时保持高效。
  3. 内置模块

    • Node.js 提供了许多内置模块,如 fs(文件系统)、http(HTTP 服务器和客户端)、path(路径处理)等,可以直接在你的代码中使用。(这也是比较常用的)

三、创建第一个 Node.js 应用

  1. 创建一个新的文件夹,并在该文件夹中创建一个名为 app.js 的文件。
  2. app.js 文件中,输入以下代码:
// 打印 "Hello, World!"
console.log('Hello, World!');
  1. 在命令提示符或终端中,进入到你创建的文件夹,并运行以下命令:
node app.js

你应该能在控制台中看到输出的 “Hello, World!”。

四、使用模块

  1. 在你的项目文件夹中,创建一个名为 math.js 的文件,并在其中输入以下代码:
function add(a, b) {return a + b;
}function subtract(a, b) {return a - b;
}module.exports = {add,subtract
};
  1. app.js 文件中,引入 math.js 模块,并使用其中的函数:
const math = require('./math');console.log(math.add(5, 3));
console.log(math.subtract(10, 4));
  1. 运行 app.js 文件,能看到输出的两个数字。

五、创建 HTTP 服务器

  1. app.js 文件中,输入以下代码:
const http = require('http');const server = http.createServer((req, res) => {res.writeHead(200, { 'Content-Type': 'text/plain' });res.end('Hello, Node.js!');
});const port = 3000;
server.listen(port, () => {console.log(`Server running at port ${port}`);
});
  1. 运行 app.js 文件,然后在浏览器中访问 http://localhost:3000,能看到 “Hello, Node.js!” 的文本。

六、案例:文件服务器

  1. 创建一个名为 fileServer.js 的文件,并输入以下代码:
const http = require('http');
const fs = require('fs');
const path = require('path');const server = http.createServer((req, res) => {const filePath = path.join(__dirname, 'public', req.url === '/'? 'index.html' : req.url);const extname = path.extname(filePath);let contentType = 'text/html';switch (extname) {case '.js':contentType = 'text/javascript';break;case '.css':contentType = 'text/css';break;case '.png':contentType = 'image/png';break;case '.jpg':contentType = 'image/jpeg';break;case '.gif':contentType = 'image/gif';break;}fs.readFile(filePath, (err, content) => {if (err) {if (err.code === 'ENOENT') {res.writeHead(404, { 'Content-Type': 'text/plain' });res.end('404 Not Found');} else {res.writeHead(500, { 'Content-Type': 'text/plain' });res.end('500 Internal Server Error');}} else {res.writeHead(200, { 'Content-Type': contentType });res.end(content, 'utf-8');}});
});const port = 8080;
server.listen(port, () => {console.log(`File server running at port ${port}`);
});
  1. 在项目文件夹中创建一个名为 public 的文件夹,并在其中创建一个 index.html 文件和一些其他的静态资源文件(如 CSS、JavaScript、图片等)。

  2. 运行 fileServer.js 文件,然后在浏览器中访问 http://localhost:8080,看到静态网页。

以下是对这段 Node.js 代码的详细解释:

一、引入模块

const http = require('http');
const fs = require('fs');
const path = require('path');

这里引入了三个核心模块:

  • http模块用于创建 HTTP 服务器。
  • fs模块用于与文件系统进行交互,比如读取文件。
  • path模块用于处理文件和目录的路径。

二、创建服务器

const server = http.createServer((req, res) => {//...
});

使用 http.createServer 创建了一个 HTTP 服务器,这个服务器接收一个回调函数作为参数。每当有新的 HTTP 请求到达服务器时,这个回调函数就会被调用,传入两个参数 req(代表请求对象)和 res(代表响应对象)。

三、确定文件路径和内容类型

const filePath = path.join(__dirname, 'public', req.url === '/'? 'index.html' : req.url);
const extname = path.extname(filePath);
let contentType = 'text/html';switch (extname) {case '.js':contentType = 'text/javascript';break;case '.css':contentType = 'text/css';break;case '.png':contentType = 'image/png';break;case '.jpg':contentType = 'image/jpeg';break;case '.gif':contentType = 'image/gif';break;
}
  • const filePath = path.join(__dirname, 'public', req.url === '/'? 'index.html' : req.url);:这行代码确定要服务的文件路径。它使用 path.join 方法将当前目录(__dirname)、“public”文件夹和请求的 URL 组合在一起。如果请求的 URL 是 /,则默认提供 “index.html” 文件。
  • const extname = path.extname(filePath);:获取文件的扩展名。
  • 根据文件扩展名设置不同的 contentType,以便客户端正确地识别和处理响应的内容类型。

四、读取文件并发送响应

fs.readFile(filePath, (err, content) => {if (err) {if (err.code === 'ENOENT') {res.writeHead(404, { 'Content-Type': 'text/plain' });res.end('404 Not Found');} else {res.writeHead(500, { 'Content-Type': 'text/plain' });res.end('500 Internal Server Error');}} else {res.writeHead(200, { 'Content-Type': contentType });res.end(content, 'utf-8');}
});
  • 使用 fs.readFile 方法读取确定的文件路径对应的文件内容。如果读取过程中出现错误:
    • 如果错误代码是 ENOENT,表示文件不存在,发送状态码 404 和 “404 Not Found” 的响应内容。
    • 如果是其他错误,发送状态码 500 和 “500 Internal Server Error” 的响应内容。
  • 如果成功读取到文件内容,发送状态码 200,并设置正确的 contentType,然后将文件内容作为响应发送给客户端。

五、启动服务器

const port = 8080;
server.listen(port, () => {console.log(`File server running at port ${port}`);
});

设置服务器监听的端口为 8080,当服务器成功启动后,在控制台打印出 “File server running at port 8080” 的消息。

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

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

相关文章

ORA-01950表空间使用权限报错排查

ORA-01950表空间使用权限报错排查 报错信息授权但是没用?到底谁没权限?报错信息 用户USER2对表USER1.T1本身有DML权限。 用户USER2往USER1的表T1插入数据报错 ORA-01950: Error : 1950, Position : 20, SQL = INSERT INTO USER1.T1 (L_DATE)VALUES (:1 ) RETURNING ROWID …

三维模型单体化软件:地理信息与遥感领域的精细化革命

在地理信息与遥感科学日新月异的发展浪潮中,单体化软件作为一股强大的驱动力,正引领着我们迈向空间信息处理与应用的新纪元。本文旨在深度解析单体化软件的核心价值、技术前沿、实践应用及面临的挑战,共同探讨这一技术如何塑造行业的未来。 …

Python生成JMeter测试脚本----HTTP信息头管理器和用户定义的变量

前言 之前的文章写了怎么用python生成JMeter脚本,生成了测试计划、线程组、Http监听器组件、响应断言、查看结果树、汇总报告、聚合报告、响应时间图。本篇内容接着讲怎么用python生成HTTP信息头管理器和用户定义的变量组件。 HTTP信息头管理器 信息头管理器的内…

client网络模块的开发和client与server端的部分联动调试

客户端网络模块的开发 我们需要先了解socket通信的流程 socket通信 server端的流程 client端的流程 对于closesocket()函数来说 closesocket()是用来关闭套接字的,将套接字的描述符从内存清除,并不是删除了那个套接字,只是切断了联系,所以我们如果重复调用,不closesocket()…

解决图片导入Excel后变成横向问题

最近有同事遇到图片打开的时候是竖向的,导入Excel后就变成横向了 我在网上搜了一下,没找到直接的答案 我猜大概是用了某些软件做处理(例如压缩分辨率)但是没处理干净 后来经过多次尝试,发现只要用windows自带的画图软件…

FouriDown: Factoring Down-Sampling into Shuffling and Superposing

摘要 https://openreview.net/pdf?idnCwStXFDQu 空间下采样技术,如步长卷积、高斯下采样和最近邻下采样,在深度神经网络中至关重要。在本文中,我们重新审视了空间下采样家族的工作机制,并分析了先前方法中使用的静态加权策略所…

【头条的AI IDE MarsCode】

文章目录 1、AI云端IDE2、网址3、可以直接导入github上的仓库代码4、总结 1、AI云端IDE 操作很简单,打开豆包MarsCode 云端 IDE,通过 GitHub 链接导入 Cambrian-1 代码库,向豆包MarsCode 提问。让豆包MarsCode 介绍 Cambrian-1 项目&#xf…

安卓主板_MTK联发科主板定制开发|PCBA定制开发

MTK联发科安卓主板,采用MT6762八核平台方案,支持谷歌Android 11.0系统,MT6762采用ARM八核A53内核芯片、主频高达2.0GHz,GPU采用ARM PowerVR GE8329650MHZ,支持主流19201080分辨率,支持硬解H.264&#xff0c…

十分钟教会你在python中使用Redis

文章目录 一、Redis 简介二、Redis 特性三、Redis 使用场景四、Redis 客户端与常用命令五、Redis在Python上的操作1. 安装 redis-py 库2. 连接Redis服务器3. 数据操作字符串操作设置键值对 set(key, string)获取字符串 get(key)检查键是否exists(key)删除键delete(key)批量设置…

Win10安装ChatTTS-2024-cuda10.1

0x00 前言 ChatTTS是专门为对话场景设计的文本转语音模型,例如大语言助手对话任务。它支持英文和中文两种语言。最大的模型使用了10万小时以上的中英文数据进行训练。目前在huggingface中的开源版本为4万小时训练且未SFT的版本。 0x01 准备环境 版本操作系统Win1…

鸿蒙内核源码分析(忍者ninja篇) | 都忍者了能不快吗

ninja | 忍者 ninja是一个叫 Evan Martin的谷歌工程师开源的一个自定义的构建系统,最早是用于 chrome的构建,Martin给它取名 ninja(忍者)的原因是因为它strikes quickly(快速出击).这是忍者的特点,可惜Martin不了解中国文化,不然叫小李飞刀更合适些.究竟有多块呢? 用Martin自…

Uniapp使用InnerAudioContext返回内部 audio 上下文 ,获取不到duration当前音频的长度,如何解决?

原因:其实是wx的bug,这个问题在开发环境中,并不会遇到。而是真机测试或发版后,就获取不到duration。 解决:我们只要去手动播放音频后,就会抓取到duration。 代码示例 关键代码 this.audioContext.play(); //手动播放音频 完整代码 Audio…

本地Docker部署Navidrome音乐服务器与远程访问听歌详细教程

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

StarRocks 存算分离数据回收原理

前言 StarRocks存算分离表中,垃圾回收是为了删除那些无用的历史版本数据,从而节约存储空间。考虑到对象存储按照存储容量收费,因此,节约存储空间对于降本增效尤为必要。 在系统运行过程中,有以下几种情况可能会需要删…

《Cloud Native Data Center Networking》(云原生数据中心网络设计)读书笔记 -- 07数据中心的边缘

本章将帮助你回答以下问题 可以用哪些方式将 Clos 拓扑连接到外部网终?边缘部署路由协议的最佳实践是什么?企业应如何处理混合云中的连接? 连接模型 为什么要连接到外部世界? 数据中心连接到外部世界的原因很多。如果你要对外提供某种服务(例如搜索服务广告推荐系统或内…

35岁程序员转行大模型:如何把握行业机遇与个人发展

对于一位35岁的程序员想要转行到大模型领域,这是一个很好的时机,因为人工智能和大模型技术正在快速发展,并且有着广泛的应用前景。以下是一些具体的步骤和建议,可以帮助您顺利地完成这一转变: 基础知识学习 数学基础&a…

科技在日常生活中的革新

在科技日新月异的今天,‌我们的生活正经历着前所未有的变革。‌从智能家居到可穿戴设备,‌科技已经渗透到我们生活的每一个角落,‌深刻地影响着我们的生活方式和社会经济的发展。‌ 智能家居系统的出现,‌无疑是科技改变生活的典…

[鹏城杯 2022]简单的php

题目源代码 <?phpshow_source(__FILE__); $code $_GET[code]; if(strlen($code) > 80 or preg_match(/[A-Za-z0-9]|\|"||\ |,|\.|-|\||\/|\\|<|>|\$|\?|\^|&|\|/is,$code)){die( Hello); }else if(; preg_replace(/[^\s\(\)]?\((?R)?\)/, , $code…

探索HarmonyOS中的列表组件及其自定义特性

在现代移动应用中&#xff0c;List组件是数据列表的关键元素。HarmonyOS中的List组件不仅具备传统的列表功能&#xff0c;还提供了丰富的自定义选项&#xff0c;允许开发者根据需求灵活调整列表的行为和外观展示。本文将探讨HarmonyOS中列举组件的自定义特性&#xff0c;包括自…

深度剖析C++string(上篇)

目录 前言 1.C string类 2.string类中的常见构造 3.string类对象的容量操作 4.. string类对象的访问及遍历操作 5. auto和范围for(补充&#xff09; auto关键字 范围for 结束语 前言 C语言我们学习了字符串和字符串的相关函数&#xff0c;在C语言中&#xff0c;字符串是…