Node.js:内置模块
Node.js:内置模块
- Node.js
- fs模块
- 读取文件
- 写入文件
- __dirname
- path模块
- 路径拼接
- 文件名解析
- http模块
- 创建服务
Node.js
传统的JavaScript
是运行在浏览器的,浏览器就是其运行环境。
浏览器提供了JavaScript
的API
,以及解析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
中,无法调用浏览器的DOM
,BOM
等API
,因为这一套运行环境并不提供,可见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
的值是null
,dataStr
的值是文件内容,如果读取失败,那么err
存储错误信息,而dataStr
是undefined
。
常见的做法是在回调函数中判断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'
,写入完成后,判断错误信息,是否写入成功。
注意点:
writeFile
写入时,如果文件不存在,那么会创建这个文件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
事件,就可以让服务器对象接收请求,绑定语法类似于JavaScript
的DOM
事件绑定:
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
,就会触发回调函数,输出收到请求
。
在绑定事件时,函数内有两个参数req
和res
,它们分别代表请求对象和响应对象。
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:内置模块 Node.jsfs模块读取文件写入文件__dirname path模块路径拼接文件名解析 http模块创建服务 Node.js 传统的JavaScript是运行在浏览器的,浏览器就是其运行环境。 浏览器提供了JavaScript的API,以及解析JavaScript的解析引擎&a…...

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

React 组件生命周期与 Hooks 简明指南
文章目录 一、类组件的生命周期方法1. 挂载阶段2. 更新阶段3. 卸载阶段 二、函数组件中的 Hooks1. useState2. useEffect3. useContext4. useReducer 结论 好的,我们来详细讲解一下 React 类组件的生命周期方法和函数组件中的钩子(hooks)。 …...

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

「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前端页面设计静态网站-仿百度
浅浅分享一下前端作业,大佬轻喷~ <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>百度(伪)</title><style>body {margin: 0;padding: 0;}.top-bar {dis…...

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

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

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

分布式锁(redisson,看门狗,主从一致性)
目录 分布式锁一:基本原理和实现方式二:分布式锁的实现1:分布式锁的误删问题2:解决误删问题 三:lua脚本解决多条命令原子性问题调用lua脚本 四:Redisson1:redisson入门2:redisson可重…...

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

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

ctfshow(94,95)--PHP特性--strpos函数
建议先学习intval函数相关内容 Web94 源代码: 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++ --- 多线程的使用
目录 一.什么是线程? 线程的特点: 线程的组成: 二.什么是进程? 进程的特点: 进程的组成: 三.线程与进程的关系: 四.C的Thread方法的使用: 1.创建线程: 2.join(…...

百度笔试(10.29)
判断s字符串是否可以通过添加某些字符变成t字符串,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] …...

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

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

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

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

【Linux指令】---获取进程的PID
获取进程的PID getpid()函数...

在centos中安装cmake
安装依赖工具: sudo yum install -y epel-release sudo yum groupinstall -y "Development Tools" sudo yum install -y wget wget 下载 CMake 3.24 的压缩包: wget https://github.com/Kitware/CMake/releases/download/v3.24.0/cmake-3.24.0-linux-x86_64.tar.gz …...

【补补漏洞吧 | 02】等保测评ZooKeeperElasticsearch未授权访问漏洞补漏方法
一、项目背景 客户新系统上线,因为行业网络安全要求,需要做等保测评, 通过第三方漏扫工具扫描系统,漏扫报告显示ZooKeeper和 Elasticsearch 服务各拥有一个漏洞,具体结果如下: 1、ZooKeeper 未授权访问【…...

Docker Compose一键部署Spring Boot + Vue项目
目录 前提条件 概述 Compose简介 Compose文件 Compose环境 Compose命令 帮助命令 关键命令 Compose部署项目 初始化环境 查看代码文件 sql数据准备 nginx配置文件准备 创建 compose.yaml 一键启动compose多个容器 浏览器访问虚拟机ip:80(可省略默认的80端口) …...

【maven】idea执行了maven的install命令给本地安装项目依赖包 安装后删除
目录 事件起因环境和工具操作过程解决办法1、找到对应的目录下的文件,手动去删除,比如我的依赖库的路径是D:\qc_code\apache-maven-3.8.2\repository 我只需要找到这个目录下对应的依赖包进行手动删除即可(不推荐,强行删除文件夹文…...

Android中的Handle底层原理
先上结论: 一个小小的Handle,就能看出你对Android底层源码理解的深浅。 老规矩,如果你能看懂我上面画的这张草图,这篇文章你可以直接跳过! 开干! 1、先对Handle在Android系统中是如何发挥作用的做一个小结: 1)每一个线程,包括UI主线程,有一个ThreadLocalMap变量:…...

最简单方式SSH连接局域网中另一台电脑的WSL2
1、首先确认一下WSL2中的SSH服务是否开启: 先安装更新一下,再安装一下ssh服务模块,这里很多人都每安装过。 sudo apt update sudo apt upgrade sudo apt install openssh-server 2、配置SSH服务器: 打开配置文件,这…...

热点聚焦:AI在医疗保健领域的深度渗透与变革
内容概要 随着人工智能技术的不断进步,我们正在见证一个充满奇迹的转变,尤其是在医疗保健领域。这种转变不仅仅涉及到提高效率,更在于重新定义我们对疾病诊断和治疗方案的理解。通过智能算法,AI能够在早期识别潜在的健康问题&…...

模板方法模式:定义算法框架的设计模式
1. 引言 在软件开发中,算法的实现通常是可变的,但其基本步骤往往是相对固定的。模板方法模式(Template Method Pattern)正是为了解决这一问题而设计的,它通过定义一个操作中的算法框架,将一些步骤的实现延…...

[Redis] Redis事务
🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…...

编译原理第一次实验报告
源代码及附件:编译原理实验一源程序及附件资源-CSDN文库实验题目 实验要求 实验设计 前两部分指出了实验的宏观把控,为了具体实施实验,我们需要预先为实验做出如下设计: 本次实验我选取了C语言的一个子集进行设计词法分析器&…...