当前位置: 首页 > news >正文

Node.js入门笔记(包含源代码)以及详细解析

Node.js 入门笔记源码

01、如何在终端中执行js 文件

  • 目标:将下面的代码语句在中断中执行

    • 代码演示:
`console.log('Hello World')for (let i = 0;i < 3;i++) {console.log(6)}`
  • 方法:在文件上右击打开在终端中执行,然后输入node空格 输入需要执行的文件名字
02、基于 fs 模块读写文件内容
  • 目标:使用fs模代码操作文件在终端中的读写操作

  • + 1、加载 fs 模块对象

    • 2、写入文件内容-----》writeFile文件中没有文件会自动帮我们创建
    • 3、读取文件
    • 代码演示:

@@

// 1、加载 fs 模块对象
const fs = require('fs')// 2、写入文件内容// 2.1:test.txt为文件路径名字// 2.2:写入的内容// 2.3:回调函数,返回错误打印出来, 否则成功
fs.writeFile('test.txt','Hello World',(err) => {if(err) console.log(err)else console.log('写入成功')
})// 3、读取文件
fs.readFile('test.txt',(err,data) => {if (err) console.log(err)// else console.log(data)      //<Buffer 48 65 6c 6c 6f 20 57 6f 72 6c 64>else console.log(data.toString())  //toString() 转为字符串形式
})
  • 执行结果为:

    写入成功
    Hello World

03、path模块-路径问题

问题: Node.js代码中,相对路径是根据终端所在路径在查找的,可能无法找到你想要的文件

  • 因此,建议在Node.js代码中,使用绝对路径(也就是需要在终端执行的代码内容)

  • __dirname 内置变量 (动态获取当前模块目录-绝对路径

    **path.join()**会使用特定于平台的分隔符,作为定界符,将所有给定的路径片段连接在一起

语法:1.加载path模块

​ 2.使用path.join(__dirname, 目标文件的路径)方法,拼接路径

  • 代码演示
  • 错误例子
//1、 引入 fs 模块  通过终端读取文件内容
// const fs = require('fs')
// fs.readFile('test.txt',(err,data) => {
//     if (err) console.log(err)
//     else console.log(data.toString())  //执行成功,将十六进制转换为字符串形式返回结果
// })
// 这里使用相对路径就发生报错error
  • 正确示例
  • path.join()方法里面,第一个参数就是__dirname 当前所在文件的文件夹地址(终端的位置) ,第二个就是目标文件的路径
// 2、解决方式:只有采用绝对路径// 1、引入 fs 模块const fs = require('fs')// 2、引入 path 模块对象const path = require('path')// 3、调用path.join()方法  配合 __dirname  组成目标文件的绝对路径console.log(__dirname)fs.readFile(path.join(__dirname,'../test.txt'),(err,data) => {if (err) console.log(err)else console.log(data.toString())})
04、基于node.js 压缩前端文件
  • 目标:把回车符(\r) 和 换行符(\n)去掉后,写入到新html文件中。

实现方法:

  1. 读取源html文件内容

    • 源html文件 === (public文件夹下面的index.html文件) 未经过压缩的源代码
  2. 正则替换字符串

  3. 写入到新的html文件中

    • 新的html文件 === (dist文件夹下面的index.html文件) 经过node使用正则压缩后的代码
// 读取public文件夹里面的前端源代码
// 1.引入读取模块fs
const fs = require('fs')
// 2.拼接路径获取绝对路径
const path = require('path')
// 3、 __dirname当前文件夹所在的地址   进行查找文件
fs.readFile(path.join(__dirname,'public/index.html'),(err,data) => {if (err) console.log(err)else {// 4、将返回的内容转为字符串显示const htmlStr = data.toString()// 5、进行字符串替换 正则查找全局// replace()是一个字符串方法,用于将指定的字符或子串替换为新的字符或子串。const resultStr = htmlStr.replace(/[\r\n]/g,'')console.log(resultStr)// 6、写入到新的  html 文件中fs.writeFile(path.join(__dirname,'dist/index.html'),resultStr,err => {})   //writeFile文件中没有文件会自动帮我们创建if (err) console.log(err)else {console.log('写入成功')}}
})
05、URL中的端口号

1.URL:简称网址,用于访问服务器里的资源

2. http://hmajax.itheima.net:80/api/province ==> 这里面:80就是 端口号

3.端口号范围:0~65535之间的任意整数 端口号默认为:80(注意1023之前的端口号是特定的被系统占用不可使用)

06、http模块-创建Web服务
  • 实现步骤:

    1、加载http模块,创建Web服务对象

    2、监听require请求事件,设置响应头和响应体

    3、配置端口号并启动Web服务

    4、浏览器请求 http://localhost:3000则是我们的创建的web服务对象

  • 代码示例
// 1、加载http模块,创建Web服务对象
const http = require('http')
const server = http.createServer()//调用http里面的方法
// 2、监听require请求事件,设置响应头和响应体
server.on('request',(req,res) => {// 设置响应头-内容类型-普通文本以及中文编码格式res.setHeader('Content-Type','text/plain;charset=utf-8')  //这里都是固定的内容类型// 设置响应体内容,结束本次请求与相应res.end('欢迎使用 Node.js 和 http 模块创建的 Web服务')
})// 3、配置端口号并启动Web服务
server.listen(3000,() => {console.log('Web 服务启动成功了')
})
  • 代码详细说明

    • 这段代码是使用Node.js的http模块创建一个简单的Web服务,以下是对代码的逐行解释:

      1. 第一行代码const http = require('http'),加载了Node.js的http模块,并将其赋值给变量http,以便后续使用该模块提供的功能。
      2. 第二行代码const server = http.createServer(),调用http模块中的createServer()方法创建一个HTTP服务器对象,并将其赋值给变量server。此时的服务器对象还没有进行具体的请求处理配置。
      3. 第四行代码server.on('request', (req, res) => { ... }),通过server对象的on方法监听request事件,该事件会在有客户端请求到达服务器时触发。回调函数接收两个参数:req表示请求对象,res表示响应对象。
      4. 在回调函数中,通过res.setHeader('Content-Type', 'text/plain;charset=utf-8')设置响应头,将内容类型设为普通文本以及中文编码格式。
      5. 接着,通过res.end('欢迎使用 Node.js 和 http 模块创建的 Web服务')设置响应体内容,并结束本次请求与相应。
      6. 最后一行代码server.listen(3000, () => { ... }),通过server对象的listen方法配置服务器监听的端口号为3000,并启动Web服务。当服务器成功启动后,回调函数会被执行,输出一条信息表示服务器启动成功。

      综上,这段代码创建了一个简单的Web服务,监听在本地主机的3000端口上。当有请求到达时,会返回固定的欢迎消息。你可以通过访问http://localhost:3000来查看Web服务的响应。

07、基于Web服务,开发提供网页资源的功能

基于Web服务,开发提供网页资源的功能

    • 目标:基于 Web 服务,开发提供网页资源的功能
    • 步骤:
      1. 基于 http 模块,创建 Web 服务
      1. 使用 req.url 获取请求资源路径,并读取 index.html 里字符串内容返回给请求方
      1. 其他路径,暂时返回不存在提示
      1. 运行 Web 服务,用浏览器发起请求
  • 代码示例
// 1. 基于 http 模块,创建 Web 服务
const fs = require('fs')
const path = require('path')
const http = require('http')
const server = http.createServer()
server.on('request',(req,res) => {      //req为代表客户端发送的HTTP请求对象。res为代表服务端发送的HTTP响应对象// 2、使用 req.url 获取请求资源路径,并读取 index.html 里字符串内容返回给请求方if (req.url === '/index.html')  {fs.readFile(path.join(__dirname,'dist/index.html'),(err,data) => {if (err) console.log(err)else {// 设置响应内容的类型为html超文本字符串 ,让浏览器解析成标签网页等res.setHeader('Content-Type','text/html;charset=utf-8')res.end(data.toString())}})} else {// 3. 其他路径,暂时返回不存在提示res.setHeader('Content-Type','text/html;charset=utf-8')res.end('你要访问的资源路径不存在')}})
server.listen(8080,() => {console.log('Web 服务启动成功')
})

代码解析

  • 这段代码的详细原理如下:

    1. 首先,引入了httpfspath模块,并通过http.createServer()创建了一个HTTP服务器对象,并将其赋值给server变量。同时,使用server.on('request', (req, res) => { ... })监听request事件,传入回调函数处理请求。
    2. 在回调函数中,首先通过req.url获取到客户端请求的资源路径。如果资源路径为/index.html,则进入条件判断块。
    3. 在条件判断块中,使用fs.readFile()方法读取指定路径下的index.html文件内容。其中,通过path.join(__dirname, 'dist/index.html')构建出index.html的完整路径。在回调函数中,判断是否有读取错误,若有错误则输出错误信息;若没有错误,则设置响应头的Content-Typetext/html;charset=utf-8,表示响应内容类型为HTML文档,然后通过res.end(data.toString())将读取到的文件内容作为响应体发送给客户端。
    4. 如果资源路径不是/index.html,则执行默认的else分支,设置响应头的Content-Typetext/html;charset=utf-8,并通过res.end('你要访问的资源路径不存在')返回一个提示消息给客户端。
    5. 最后,通过server.listen(8080, () => { ... })配置服务器监听的端口号为8080,并在服务器成功启动后输出一条提示信息。

    总结来说,这段代码创建了一个简单的HTTP服务器,当客户端请求的资源路径为/index.html时,会读取指定路径下的index.html文件内容并返回给客户端,否则返回一个资源不存在的提示消息。通过监听request事件和处理回调函数,实现了对不同请求路径的处理和响应。最后,通过server.listen()方法指定监听的端口号,并在服务器成功启动后输出启动成功的提示信息。

  • 关于request监听函数中的req和res的详细解释

    • 在Node.js的http模块中,reqres是通常用于表示HTTP请求对象和HTTP响应对象的变量名。

      • req(或者常见的缩写)是request的缩写,代表客户端发送的HTTP请求对象。它包含了与请求相关的各种信息,如请求方法、URL、请求头、请求参数等。通过req对象,我们可以获取和解析客户端发送的请求数据,以便在服务器端进行处理和响应。
      • res(或者常见的缩写)是response的缩写,代表服务端发送的HTTP响应对象。它用于设置和发送服务端的响应给客户端。通过res对象,我们可以设置响应的状态码、响应头、响应体内容等。最终,将响应发送给客户端,完成HTTP请求-响应周期。

      在HTTP请求过程中,客户端发送请求给服务器,服务器接收到请求后创建一个req对象来表示该请求。然后,服务器处理请求并生成相应的内容,将其存放在一个res对象中,并通过网络将res对象发送给客户端。

      所以,reqres分别代表了客户端发送的HTTP请求对象和服务端返回的HTTP响应对象,在开发Web应用时,我们可以使用这两个对象来实现对请求的处理和对响应的配置。

相关文章:

Node.js入门笔记(包含源代码)以及详细解析

Node.js 入门笔记源码 01、如何在终端中执行js 文件 目标&#xff1a;将下面的代码语句在中断中执行 代码演示&#xff1a; console.log(Hello World)for (let i 0;i < 3;i) {console.log(6)}方法&#xff1a;在文件上右击打开在终端中执行&#xff0c;然后输入node空格 输…...

windows自动化点击大麦app抢购、捡漏,仅支持windows11操作系统

文章目录 必要条件程序运行必要条件 确保windows11版本操作系统,如果不是可以通过镜像升级为windows11如果已经是windows11操作系统,确保更新到最新版本 修改系统所在时区,将国家或地区改为美国 开启虚拟化 勾选Hyper-V,如果没有则不需要勾选 勾选虚拟机平台 勾选完毕,点…...

vue 拦截 v-html 中 a 标签 href 跳转

记录 template 中 给需要 拦截的 代码片段加上click 方法 click“targetNodeNameClick” <p class"message-content message-content-text" v-html"replaceURLWithHTMLLinks(getText(message))" click"targetNodeNameClick"></p>然…...

分布式id、系统id、业务id以及主键之间的关系

推荐 连分布式ID都理解不了&#xff0c;你是刚培训出来冒充面试官的吧 1 分布式id、系统id、业务id以及主键之间的关系 分布式ID、系统ID、业务ID和主键的关系&#xff1a; 分布式ID&#xff1a;在分布式系统中&#xff0c;由于存在多个独立的节点&#xff0c;为了保证每个节…...

设计模式七:适配器模式(Adapter Pattern)

适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;用于将一个类的接口转换成客户端所期望的另一个接口。它允许不兼容的接口能够协同工作。 适配器模式涉及角色&#xff1a; 目标接口&#xff08;Target Interface&#xff09;&#xff1a…...

数据结构---队列

(一)队列之基础补充 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。 —— 百科 「队列 Queue」是一种…...

chatGPT在软件测试中应用方式有哪些?

ChatGPT可以在软件测试中以以下方式应用&#xff1a; 1. 自动化对话测试&#xff1a;ChatGPT可以用于自动化对话测试&#xff0c;模拟用户与软件系统进行实时对话。它可以扮演用户的角色&#xff0c;向系统发送各种类型的指令和请求&#xff0c;并验证系统的响应是否符合预期。…...

chatgpt 接口使用(一)

使用api实现功能 参考链接&#xff1a;https://platform.openai.com/examples 安装库&#xff1a; pip3 install openai 例如&#xff1a; import os import openaiopenai.api_key os.getenv("OPENAI_API_KEY") response openai.ChatCompletion.create(model&q…...

【个人笔记】Linux 服务管理两种方式service和systemctl

service命令与systemctl 命令 service 命令与传统的 SysVinit 和 Upstart 初始化系统相关。较早期的 Linux 发行版&#xff08;如早期的 Ubuntu、Red Hat 等&#xff09;使用了这些初始化系统。service 命令用于启动、停止、重启和查询系统服务的状态。虽然许多现代 Linux 发行…...

HCIP中期考试实验

考试需求 1、该拓扑为公司网络&#xff0c;其中包括公司总部、公司分部以及公司骨干网&#xff0c;不包含运营商公网部分。 2、设备名称均使用拓扑上名称改名&#xff0c;并且区分大小写。 3、整张拓扑均使用私网地址进行配置。 4、整张网络中&#xff0c;运行OSPF协议或者BGP…...

【WebRTC---源码篇】(二十二)WebRTC的混音处理

音频混音主力 音频混音主体主要通过(重采样) + (混音)为主 音频重采样 内容实现是在webrtc::voe中实现的,下面来对重采样全流程逐一分析 。 void RemixAndResample(const AudioFrame& src_frame,//源音频数据帧PushResampler<int16_t>* resampler,//重采样对…...

MTK system_server 卡死导致手机重启案例分析

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、MTK AEE Log分析工具二、AEE Log分析流程三、system_server 卡死案例分析及解决 本文主要针对 Exception Type: system_server_watchdog , system_…...

加强 Kubernetes 能力:利用 CRD 定义多版本资源的实现方式

姚灿武&#xff0c;Rancher 中国研发工程师&#xff0c;拥有 7 年云计算领域经验&#xff0c;热衷开源技术&#xff0c;在云原生相关技术领域拥有丰富的开发和实践经验。 CRD&#xff0c;即自定义资源定义&#xff08;Custom Resource Definition&#xff09;&#xff0c;是 Ku…...

区块链应用 DApp 开发需要掌握的技能

文章目录 前言为什么要开发 DAppDApp 的优势DApp 应用范围DApp 开发者技能 前言 前面区块链系列的文章中介绍了区块链技术、智能合约、web3js&#xff0c;Solidity 编程语言&#xff0c;在开发者的角度就是要基于这些知识在Web3时代去开发一个 DApp&#xff08;去中心化应用程…...

关于新版本selenium定位元素报错:‘WebDriver‘ object has no attribute ‘find_element_by_id‘等问题

由于一段时间没有使用Selenium&#xff0c;当再次使用时发现之前写的Selenium元素定位的代码运行之后会报错&#xff0c;发现是Selenium更新到新版本&#xff08;4.x版本&#xff09;后&#xff0c;以前的一些常用的代码的语法发生了改变&#xff0c;当然如果没有更新过或是下载…...

c++通过自然语言处理技术分析语音信号音高

对于语音信号的音高分析&#xff0c;可以使用基频提取技术。基频是指一个声音周期的重复率&#xff0c;也就是一个声音波形中最长的周期。 通常情况下&#xff0c;人的声音基频范围是85Hz到255Hz。根据语音信号的基频可以推断出其音高。 C中可以使用数字信号处理库或语音处理库…...

[pymc3][python]pymc3安装后测试代码2

测试环境&#xff1a; pymc33.11.2 代码&#xff1a; import numpy as np import pymc3 as pm import matplotlib.pyplot as pltif __name__ __main__:# 生成随机数据np.random.seed(123)x np.linspace(0, 1, 100)y 0.5 * x np.random.normal(0, 0.1, size100)# 定义概率…...

Go语言time库,时间和日期相关的操作方法

time库 用于处理时间、日期和时区的核心库。在实际开发中&#xff0c;常常需要与时间打交道&#xff0c;例如记录日志、处理时间差、计算时间间隔等等。因此&#xff0c;掌握time库的使用方法对于Go开发者来说非常重要。 在Go语言中&#xff0c;时间表示为time.Time类型&…...

JVM总结笔记

JVM JVM是什么?JVM 的主要组成部分JVM工作流程JVM内存模型直接内存与堆内存的区别&#xff1a;堆栈的区别Java会存在内存泄漏吗&#xff1f;简述Java垃圾回收机制垃圾收集算法轻GC(Minor GC)和重GC(Full GC)新生代gc流程JVM优化与JVM调优 JVM是什么? JVM是Java Virtual Mach…...

C++ 缓存再排序,解决多线程处理后的乱序问题,不知道思路对不对[挠下巴]

C 缓存再排序&#xff0c;解决多线程处理后的乱序问题&#xff0c;不知道思路对不对[挠下巴] 使用map默认会根据key排序的原理作缓存&#xff0c;队列满了依次推出&#xff0c;抛弃掉过时的数据 #include <functional> #include <iostream> #include <map> #…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划&#xff1a;基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标&#xff1a;为安全大模型创建高质量、去偏、符合伦理的训练数据集&#xff0c;涵盖安全相关任务&#xff08;如有害内容检测、隐私保护、道德推理等&#xff09;。 1.1 数据收集 描…...

Python竞赛环境搭建全攻略

Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型&#xff08;算法、数据分析、机器学习等&#xff09;不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...

Selenium 查找页面元素的方式

Selenium 查找页面元素的方式 Selenium 提供了多种方法来查找网页中的元素&#xff0c;以下是主要的定位方式&#xff1a; 基本定位方式 通过ID定位 driver.find_element(By.ID, "element_id")通过Name定位 driver.find_element(By.NAME, "element_name"…...

职坐标物联网全栈开发全流程解析

物联网全栈开发涵盖从物理设备到上层应用的完整技术链路&#xff0c;其核心流程可归纳为四大模块&#xff1a;感知层数据采集、网络层协议交互、平台层资源管理及应用层功能实现。每个模块的技术选型与实现方式直接影响系统性能与扩展性&#xff0c;例如传感器选型需平衡精度与…...