Node.js:内置模块

news2024/10/30 13:12:08

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,那么网页就无法解析中文。


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

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

相关文章

「漏洞复现」浪潮海岳 HCM Cloud download 任意文件读取漏洞

0x01 免责声明 请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;作者不为此承担任何责任。工具来自网络&#xff0c;安全性自测&#xff0c;如有侵权请联系删…

接雨水

接雨水 ​ 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,…

String的长度有限,而我对你的思念却无限延伸

公主请阅 1. 为什么学习string类&#xff1f;2. string类的常用接口2.1 string类对象的常见构造2.1.1 string 2.2 operator[]2.3 迭代器2.4 auto自动推导数据类型2.5 范围for2.6 迭代器第二层2.7 size和length获取字符串的长度2.8 max_size 获取这个字符串能设置的最大长度2.9 …

Docker Compose一键部署Spring Boot + Vue项目

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

【python实操】python小程序之测试报告

引言 python小程序之测试报告 文章目录 引言一、测试报告1.1 概念1.1.1 使用Pytest和Allure生成测试报告1.1.2 使用unittest和HTMLTestRunner生成测试报告1.1.3 总结 1.2 题目1.3 代码1.3 代码解释 二、思考 一、测试报告 1.1 概念 python生成测试报告&#xff0c;常用的方法包…

「Mac畅玩鸿蒙与硬件10」鸿蒙开发环境配置篇10 - 项目实战:计数器应用

本篇将通过一个简单的计数器应用,带你体验鸿蒙开发环境的实际操作流程。本项目主要练习组件的使用、事件响应和状态管理,帮助开发者熟悉基本的应用构建流程。 关键词 计数器应用组件操作事件响应状态管理HarmonyOS 应用开发一、创建计数器项目 1.1 在 DevEco Studio 中新建项…

arcgis pro 3.3.1安装教程

一、获取方式&#xff1a; http://dt4.8tupian.net/2/29913a61b1500.pg3二、软件目录&#xff1a; 三、安装步骤&#xff1a; &#xff08;1&#xff09;安装软件运行环境windowsdesktop-runtime 8.0.4; &#xff08;2&#xff09;选中安装文件arcgispro_33zh_cn_190127.exe&…

线性代数(1)——线性方程组的几何意义

线性代数的基本问题是求解个未知数的个线性方程&#xff1b; 例如&#xff1a;&#xff08;方程1&#xff09;。 在线性代数的第一讲中&#xff0c;我们从Row Picture、Column Picture、Matrix Picture三个角度来看这个问题。 上面的系统是二维的。通过添加第三个变量&#…

【Linux】-常见指令(2)

接上一篇文章【Linux】-常见指令&#xff08;1&#xff09;-CSDN博客&#xff0c;继续介绍linux常用指令。 目录 一、man指令 &#xff1a;查看信息 1、作用 2、手册 二、cp指令&#xff1a;拷贝 1、作用 2、拷贝到同级目录 三、mv指令&#xff1a;剪切 1、作用 2、使用…

[论文阅读]SimCSE: Simple Contrastive Learning of Sentence Embeddings

SimCSE&#xff1a;句子嵌入的简单对比学习 SimCSE: Simple Contrastive Learning of Sentence Embeddings http://arxiv.org/abs/2104.08821 EMNLP 2021 文章介绍了SimCSE&#xff0c;这是一种简单的对比学习框架&#xff0c;采用了自监督来提升模型的句子表示能力 而自监…

(蓝桥杯C/C++)——常用库函数

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、 二分查找 1.二分查找的前提 2.binary_ search函数 3.lower_bound和upper_bound 二、排序 1.sort概念 2.sort的用法 3.自定义比较函数 三、全排列 1.next p…

【优先算法】双指针

✨✨欢迎大家来到Celia的博客✨✨ &#x1f389;&#x1f389;创作不易&#xff0c;请点赞关注&#xff0c;多多支持哦&#x1f389;&#x1f389; 所属专栏&#xff1a;优先算法 个人主页&#xff1a;Celias blog~ 目录 ​​​​​​移动零 复写零 快乐数 盛水最多的容器 …

认知战认知作战:认知战驱动引导青年情绪接纳思潮

认知战认知作战&#xff1a;认知战驱动引导青年情绪接纳思潮 认知战认知作战&#xff1a;认知战驱动引导青年情绪接纳思潮 关键词&#xff1a;认知作战,新质生产力,人类命运共同体,认知战,认知域,认知战研究中心,认知战争,认知战战术,认知战战略,认知域作战研究,认知作战,认知…

C语言 | Leetcode C语言题解之第508题斐波那契数

题目&#xff1a; 题解&#xff1a; struct Matrix {int mat[2][2]; };struct Matrix matrixMultiply(struct Matrix* a, struct Matrix* b) {struct Matrix c;for (int i 0; i < 2; i) {for (int j 0; j < 2; j) {c.mat[i][j] (*a).mat[i][0] * (*b).mat[0][j] (*a…

fmql之Linux以太网

正点原子第57章。 dts fmql-dtsi&#xff1a; 我们用的PHY芯片是RTL8211F&#xff1a; 需要添加PHY信息&#xff1a; fmql-dtsi提供的参考&#xff1a; 根据vivado工程自动生成的&#xff1a; reg <0x1>; 配置 疑问 网口通讯需要网线&#xff0c;但是目前板卡上只有PS…

新工具可绕过 Google Chrome 的新 Cookie 加密系统

一位研究人员发布了一款工具&#xff0c;用于绕过 Google 新推出的 App-Bound 加密 cookie 盗窃防御措施并从 Chrome 网络浏览器中提取已保存的凭据。 这款工具名为“Chrome-App-Bound-Encryption-Decryption”&#xff0c;由网络安全研究员亚历山大哈格纳 (Alexander Hagenah…

51c大模型~合集6

我自己的原文哦~ https://blog.51cto.com/whaosoft/11519413 #斯坦福小镇 机器人版的「斯坦福小镇」来了&#xff0c;专为具身智能研究打造 首个专为各种机器人设计的模拟互动 3D 社会。 还记得斯坦福的 AI 小镇吗&#xff1f;这是斯坦福的 AI 研究者打造的一个虚拟环境。在这…

【机器学习】音乐与AI的交响:机器学习在音乐产业中的应用

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀目录 &#x1f50d;1. 引言&#x1f4d2;2. 机器学习在音乐创作中的革新&#x1f341;AI作曲家的诞生与作品展示&#x1f342;机器学习在音乐…

用unity XR interaction Toolkit 制作垃圾分类虚拟仿真项目

项目效果演示&#xff1a; 垃圾分类虚拟仿真项目演示 1.环境配置 选择universal 3D(通用渲染管道)项目&#xff08;不然导入素材包会丢失材质&#xff09;。 选择Window->Package Manager,安装其中的XR interaction Toolkit。 选择其中的Samples,导入Starter Assets。 选择…

[vulnhub]Kioptrix: Level 1.2 (#3)

https://www.vulnhub.com/entry/kioptrix-level-12-3,24/ 主机发现端口扫描 使用nmap扫描网段类存活主机 因为靶机是我最后添加的&#xff0c;所以靶机IP是169 nmap -sP 192.168.75.0/24 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-10-29 13:16 CST …