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

Node.js:内置模块

Node.js:内置模块

    • Node.js
    • fs模块
      • 读取文件
      • 写入文件
      • __dirname
    • path模块
      • 路径拼接
      • 文件名解析
    • http模块
      • 创建服务


Node.js

传统的JavaScript是运行在浏览器的,浏览器就是其运行环境。

在这里插入图片描述

浏览器提供了JavaScriptAPI,以及解析JavaScript的解析引擎,常见的解析引擎如下:

  • Chrome 浏览器:V8
  • Firefox 浏览器:OdinMonkey(奥丁猴)
  • Safri 浏览器:JSCore
  • IE 浏览器:Chakra(查克拉)

其中V8引擎的性能最好,所以前端程序员最常使用chrome来运行代码。

那么这样一个JavaScript架构,可以支持JavaScript成为一款后端语言吗?并不可以,因为它没有提供后端所需要的API,比如文件读写,网络请求等等。

为了让JavaScript可以成为一款后端语言,完成后端所需要完成的任务,就需要为其提供一套其它的运行环境,而这个运行环境就是Node.js

在这里插入图片描述

Node.js中,为JavaScript提供了后端所需的API,使用V8引擎进行代码解析,让JavaScript可以完成后端工作。

但是在Node.js中,无法调用浏览器的DOMBOMAPI,因为这一套运行环境并不提供,可见JavaScript的前后端运行环境是分离的。

安装地址:

https://nodejs.org/

建议下载LTS版本,这是稳定版本。这个安装很简单,一直点击next就可以了。

安装后,输入node -v检查是否安装成功:

C:\Users\xxx> node -v
v20.18.0

安装成功后,可以通过vscode执行node代码。

console.log("hello node.js")

编写代码后按下F5

在这里插入图片描述

执行时,其会提示可以使用Node.js进行编译,选择Node.js

在这里插入图片描述

此时就可以在控制台看到输出结果了。

也可以通过命令来执行程序:

node 执行的文件

在这里插入图片描述


fs模块

fs是官方提供的操作文件的模块,其可以对文件进行读取与写入。

导入模块语法:

const fs = require('fs')

此处的require方法,用于导入模块,返回值用一个对象接收,后续通过该变量使用模块。


读取文件

读取文件使用fs.readFile方法:

fs.readFile(path[, options], callback)
  • path:读取文件的存放路径
  • options:可选参数,读取文件时候采用的编码格式,一般默认指定 utf8
  • callback:回调函数,函数内包含两个参数,分别拿到读取失败和成功的结果

示例:

const fs = require('fs')fs.readFile('./files/1.txt', 'utf8', function(err, dataStr) {console.log("err = " + err)console.log("dataStr = " + dataStr)
})

第一行代码导入fs模块,随后通过readFile读取文件。

读取成功:

err = null
dataStr = 文件内容

读取失败:

err = Error: ENOENT: no such file or directory
dataStr = undefined

不论是否读取成功,都调用回调函数。如果读取成功,err的值是nulldataStr的值是文件内容,如果读取失败,那么err存储错误信息,而dataStrundefined

常见的做法是在回调函数中判断err的值,如果err为空,直接返回错误信息,如果没有返回,那么后续就进行正常的文件读取操作。

fs.readFile('./files/11.txt', 'utf8', function(err, dataStr) {if (err) {return console.log('error' + err.message)}console.log('success' + dataStr)
})

写入文件

写入文件使用fs.writeFile方法:

fs.writeFile(path, data[, options], callback)
  • path:写入文件的存放路径
  • data:要写入的内容
  • options:可选参数,读取文件时候采用的编码格式,一般默认指定 utf8
  • callback:回调函数,函数内包含一个参数,表示错误信息

同样的,如果写入成功,那么回调函数的第一个参数为null,如果写入失败,那么第一个参数为错误信息。

示例:

const fs = require('fs')fs.writeFile('./files/3.txt', 'hello node.js', function(err) {if (err) {return console.log('error' + err.message)}console.log('success')
})

以上代码完成对./files/3.txt文件的写入,写入内容是'hello node.js',写入完成后,判断错误信息,是否写入成功。

注意点:

  1. writeFile写入时,如果文件不存在,那么会创建这个文件
  2. writeFile写入前,会清空被写入的文件,原先内容会被覆盖

__dirname

fs模块中,如果使用相对路径,那么此时node.js会以执行命令的路径为出发点,查找相对路径,而不是以被执行的文件为出发点查找相对路径,这和其他语言略有点不同。

以下代码为例:

fs.readFile('./hello.txt', 'utf8', function(err, dataStr) {if (err) {return console.log('error' + err.message)}console.log('success: ' + dataStr)
})

path.js文件中写JavaScript代码,在其同级目录下,存在一个hello.txt。如果在path.js目录下运行程序,那么程序可以正常输出:

在这里插入图片描述

此时进行路径拼接当前路径 + 相对路径,得到D:\code_web\test\Node\01\hello.txt,这是正确的路径,输出成功了。

但是如果跳转到别的目录执行代码:

在这里插入图片描述

此时进行路径拼接当前路径 + 相对路径,得到D:\code_web\test\Node\hello.txt,这是错误的路径,输出失败了。

可以看出,Node.js不适合使用相对路径查找文件,但是由于不同主机环境不同,绝对路径往往不一样。为此Node.js提供了一个变量__dirname,其标识着当前.js文件的所处目录。

path.js中输出_dirname

console.log(__dirname)

在这里插入图片描述

此时不论出于哪一个目录,都可以成功标识出path.js的所处目录。

所以在fs中使用相对路径时,最好通过__dirname + 相对路径来查找文件:

fs.readFile(__dirname + '/hello.txt', 'utf8', function(err, dataStr) {if (err) {return console.log('error' + err.message)}console.log('success: ' + dataStr)
})

这样不论在什么地方运行程序,都可以正常检索路径了。


path模块

path也是Node.js的内置模块,专门用于处理路径。

导入模块:

const path = require('path')

先前的__dirname + '/hello.txt'操作,是不太正规的,path模块有专门用于路径拼接的方法。


路径拼接

path.join方法,可以将多个路径片段拼接为完整的路径字符串。

语法:

path.join(path, [path...])

传入多个路径片段path,最后返回拼接好的路径。

示例:

const pathStr = path.join('/a', '/b/c', './d', 'e')
console.log(pathStr)

输出结果:

\a\b\c\d\e

path.join不是简单的字符串拼接,此处的e前面没有/路径分隔符,其自动补充上去,而./d./表示当前路径,最后被省略掉了。

path.join还会进行路径的推演,来缩短路径,比如说../表示上级目录,那么path.join就会撤销之前的操作:

const pathStr = path.join('/a', '/b/c', '../../', './d', 'e')
console.log(pathStr)

输出结果:

\a\d\e

此时'/b/c'这个路径就被抵消了。

相对路径拼接就可以使用这个方法:

path.join(__dirname, '/hello.txt')

比如有时候相对路径前面会带一个./,如果直接进行字符串假发__dirname + './hello.txt',此时路径就会错误,无法解析。但是使用path.join就会忽略这个./,得到正确的路径。


文件名解析

有的时候,获取到的文件,是以路径的形式出现,此时为了解析出具体的文件名,就需要进行一定的字符串检索操作,比较麻烦。此时可以使用 path.basename方法,快速解析出文件名。

path.basename(path[, ext])

参数:

  • path:文件路径
  • ext:扩展文件名

如果直接输入一个路径,path.basename会解析出文件名:

const path = require('path')
const fpath = '/a/b/c/index.html'const fullName = path.basename(fpath)
console.log(fullName)

输出结果:

index.html

如果想要得到去掉后缀的文件名,此时填入第二个参数去掉后缀:

const path = require('path')const fpath = '/a/b/c/index.html'const nameWithoutExt = path.basename(fpath, '.html')
console.log(nameWithoutExt)

输出结果:

index

这样就同时去掉了路径前缀,以及文件后缀。

如果需要单独获得文件的扩展名,可以使用path.extname方法:

path.extname(path)

示例:

const path = require('path')
const fpath = '/a/b/c/index.html'const fext = path.extname(fpath)
console.log(fext)

输出结果:

.html

http模块

http模块是Node.js的内置模块,其可以快速创建一个web服务器,并对外提供http服务。

导入模块:

const http = require('http')

创建服务

Node.js可以快速创建服务,基于createServer方法。

语法:

http.createServer()

该方法返回一个服务器的对象,基于这个对象,就可以让本机接收服务请求。

通过绑定request事件,就可以让服务器对象接收请求,绑定语法类似于JavaScriptDOM事件绑定:

server.on('require', callback)

第一个参数指定要绑定的事件,第二个参数为事件触发后的回调函数。require事件会监听来自外部的请求,一旦收到请求,就执行回调函数。

最后只需要启动服务器,就可以开始接收请求了:

server,listen(port, callback)

第一个参数是监听的端口号,表示该服务使用的端口号。如果服务器启动成功,就会调用回调函数。

示例:

const http = require('http')// 创建 web 服务器实例
const server = http.createServer()
// 为服务器实例绑定 request 事件,监听客户端的请求
server.on('request', function (req, res) {console.log('收到请求')
})
// 启动服务器
server.listen(8080, function () {  console.log('服务启动成功')
})

如果运行成功,那么此时去浏览器访问127.0.0.1:8080,就会触发回调函数,输出收到请求

在绑定事件时,函数内有两个参数reqres,它们分别代表请求对象和响应对象。

  • req:请求对象,包含客户端相关数据与属性

其包含两个关键属性,url是客户端请求的地址,method是客户端的请求方式。

server.on('request', function (req, res) {console.log(req.url)console.log(req.method)
})

用浏览器访问127.0.0.1:8080结果:

/
GET

用浏览器访问127.0.0.1:8080/index.html结果:

/index.html
GET

url拿到的是除去主机地址后,具体请求的文件路径。

  • res:请求对象,包含服务器相关数据与属性

在先前的所有操作中,使用浏览器请求,都是得不到结果的,因为服务器根本不响应,如果想要进行响应,就需要res.end
方法。

server.on('request', function (req, res) {res.end("<h1>hello world!</h1>")
})

此时再访问浏览器,就可以得到一个文本响应:

在这里插入图片描述

http模块发送的是HTTP响应,还可以通过res.setHeader方法指定响应头的内容。

语法:

res.setHeader(name, value)
  • name:指定要设置的HTTP头的名称
  • value:指定要设置的HTTP头的值

最常见的做法是响应一个html文件,此时可以设置Content-Type属性,来指定文件类型:

res.setHeader('Content-Type', 'text/html; charset=utf-8');

此处指定响应的类型为html文件,并且编码的字符集为utf-8,这样客户端浏览器就知道如何解析这样一个响应。如果不指定utf-8,那么网页就无法解析中文。


相关文章:

Node.js:内置模块

Node.js&#xff1a;内置模块 Node.jsfs模块读取文件写入文件__dirname path模块路径拼接文件名解析 http模块创建服务 Node.js 传统的JavaScript是运行在浏览器的&#xff0c;浏览器就是其运行环境。 浏览器提供了JavaScript的API&#xff0c;以及解析JavaScript的解析引擎&a…...

3. keil + vscode 进行stm32协同开发

1. 为什么使用vscode 主要还是界面友好&#xff0c;使用习惯问题&#xff0c;vscode 从前端&#xff0c;js, c/c, qt, 仓颉&#xff0c;rust都有很好插件的支持&#xff0c;并且有romote&#xff0c; wsl 等很多插件可以提高效率&#xff0c; 唯一的问题就是要使用插件进行环境…...

React 组件生命周期与 Hooks 简明指南

文章目录 一、类组件的生命周期方法1. 挂载阶段2. 更新阶段3. 卸载阶段 二、函数组件中的 Hooks1. useState2. useEffect3. useContext4. useReducer 结论 好的&#xff0c;我们来详细讲解一下 React 类组件的生命周期方法和函数组件中的钩子&#xff08;hooks&#xff09;。 …...

【springcloud】gateway网关的作用

目录 1. 说明2. 路由转发3. 负载均衡4. 安全认证与授权5. 熔断与降级6. 请求限流7. 监控与日志8. 过滤器功能 1. 说明 1.在Spring Cloud中&#xff0c;Gateway网关扮演着至关重要的角色。2.基于Spring Framework 5、Spring Boot和Project Reactor构建的API网关&#xff0c;专为…...

「C/C++」C++11 之<thread>多线程编程

✨博客主页何曾参静谧的博客📌文章专栏「C/C++」C/C++程序设计📚全部专栏「VS」Visual Studio「C/C++」C/C++程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasolid函数说明目…...

HTML前端页面设计静态网站-仿百度

浅浅分享一下前端作业&#xff0c;大佬轻喷~ <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>百度&#xff08;伪&#xff09;</title><style>body {margin: 0;padding: 0;}.top-bar {dis…...

百度SEO是否还有用?福州百度SEO专家林汉文为你深度解析

大家好&#xff0c;我是林汉文&#xff0c;一名专注于百度SEO优化的专家&#xff0c;最近有很多人问我&#xff1a;百度SEO还有用吗&#xff1f;在如今快速变化的数字营销环境中&#xff0c;这确实是一个值得探讨的问题。今天&#xff0c;我就来为大家详细分析百度SEO的现状&am…...

数学建模学习(134):使用Python基于WISP的多准则决策分析

WISP算法技术性文章 1. 算法介绍 WISP(Weighted Independent Set Problem)是一种优化算法,主要用于解决图论中的加权独立集问题。加权独立集问题是一个经典的组合优化问题,涉及从一个图中选择一个独立的顶点集,使得所选顶点的总权重最大。这个问题在计算机科学、运筹学、…...

.net core NPOI以及NOPI mapper

我们在日常开发中对Excel的操作可能会比较频繁&#xff0c;好多功能都会涉及到Excel的操作。在.Net Core中大家可能使用Npoi比较多&#xff0c;这款软件功能也十分强大&#xff0c;而且接近原始编程。但是直接使用Npoi大部分时候我们可能都会自己封装一下&#xff0c;毕竟根据二…...

分布式锁(redisson,看门狗,主从一致性)

目录 分布式锁一&#xff1a;基本原理和实现方式二&#xff1a;分布式锁的实现1&#xff1a;分布式锁的误删问题2&#xff1a;解决误删问题 三&#xff1a;lua脚本解决多条命令原子性问题调用lua脚本 四&#xff1a;Redisson1&#xff1a;redisson入门2&#xff1a;redisson可重…...

openEuler 服务器Python自动化安装WEB服务器和文件上传服务(1)

一、系统准备 我们的服务器采用了 openEuler 22.03 (LTS-SP4) 的初始化服务器模式安装 二、安装步骤 &#xff08;一&#xff09;安装依赖库 在终端中运行以下命令确保系统安装了必要的依赖&#xff1a; sudo dnf install -y python3上述 Python 脚本中的依赖库会在运行 Py…...

【Python游戏开发】石头剪刀布游戏(附完整Python完整代码)

石头剪刀布游戏:Pygame实现 结果图前言核心函数思考步骤实现原理和公式代码实现结论结果图 前言 石头剪刀布是一种经典的猜拳游戏,简单易玩但却蕴含着一定的策略性。本文将介绍如何使用Python和Pygame库开发一个简单的石头剪刀布游戏,并探讨其中的核心功能实现和思考过程。 …...

ctfshow(94,95)--PHP特性--strpos函数

建议先学习intval函数相关内容 Web94 源代码&#xff1a; include("flag.php"); highlight_file(__FILE__); if(isset($_GET[num])){$num $_GET[num];if($num"4476"){die("no no no!");}if(preg_match("/[a-z]/i", $num)){die(&qu…...

C++ --- 多线程的使用

目录 一.什么是线程&#xff1f; 线程的特点&#xff1a; 线程的组成&#xff1a; 二.什么是进程&#xff1f; 进程的特点&#xff1a; 进程的组成&#xff1a; 三.线程与进程的关系&#xff1a; 四.C的Thread方法的使用&#xff1a; 1.创建线程&#xff1a; 2.join(…...

百度笔试(10.29)

判断s字符串是否可以通过添加某些字符变成t字符串&#xff0c;s是否是t的子序列 s input() n int(input()) st set() res [] for idx in range(n):t input()if t in st or len(t) < len(s):continuest.add(t)i,j 0,0while i < len(s) and j < len(t):if s[i] …...

数据库版本更新后,如何迁移数据?

数据库版本更新后迁移数据是一个需要谨慎处理的过程。以下是一般步骤和最佳实践&#xff1a; 1. **备份数据**&#xff1a; 在进行任何迁移之前&#xff0c;确保对现有数据库进行完整备份。这可以是物理备份&#xff08;如数据库文件的拷贝&#xff09;或逻辑备份&#xff…...

Chrome与火狐的安全功能全面评估

在当今数字化时代&#xff0c;网络安全已成为用户最为关注的问题之一。作为两款广受欢迎的浏览器&#xff0c;Chrome和火狐&#xff08;Firefox&#xff09;都提供了多种安全功能来保护用户的在线隐私和数据安全。本文将全面评估这两款浏览器的安全功能&#xff0c;帮助用户更好…...

微服务设计模式 - 重试模式(Retry Pattern)

微服务设计模式 - 重试模式&#xff08;Retry Pattern&#xff09; 定义 重试模式&#xff08;Retry Pattern&#xff09;是一种微服务中的设计模式&#xff0c;用于在临时性失败&#xff08;如网络故障或暂时不可用的服务&#xff09;发生时&#xff0c;自动重新尝试请求&…...

DNS配置

1.搭建dns服务器能够对自定义的正向或者反向域完成数据解析查询。 2.配置从DNS服务器&#xff0c;对主dns服务器进行数据备份。 正反向解析 [rootlocalhost ~]# vim /etc/named.conf options {listen-on port 53 { 192.168.111.130; };directory "/var/named&quo…...

【Linux指令】---获取进程的PID

获取进程的PID getpid()函数...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...