Node.js day-01

01.Node.js 讲解

什么是 Node.js,有什么用,为何能独立执行 JS 代码,演示安装和执行 JS 文件内代码

  1. Node.js 是一个独立的 JavaScript 运行环境,能独立执行 JS 代码,因为这个特点,它可以用来编写服务器后端的应用程序

  2. Node.js 作用除了编写后端应用程序,也可以对前端代码进行压缩,转译,整合等等,提高前端开发和运行效率

  3. Node.js 基于Chrome V8 引擎封装,独立执行 JS 代码,但是语法和浏览器环境的 V8 有所不同,没有 document 和 window 但是都支持 ECMAScript 标准的代码语法

  4. 想要得到 Node.js 需要把这个软件安装到电脑,在素材里有安装程序(window 和 mac 环境的)参考 PPT 默认下一步安装即可

  5. Node.js 没有图形化界面,需要使用 cmd 终端命令行(利用一些命令来操控电脑执行某些程序软件)输入,node -v 检查是否安装成功

/**
 * 目标:编写 js 代码,用 node 命令执行
 * 终端作用:敲击命令,调用对应程序执行
 * 终端打开:目标文件->右键->在集成终端中打开
 * 命令:node xxx.js (注意路径)
 */
for (let i = 0; i < 3; i++) {
    console.log(i)   
}

02.fs模块 读写文件

  1. 模块:类似插件,封装了方法和属性供我们使用

  2. fs 模块:封装了与本机文件系统进行交互的,方法和属性

/**
 * 目标:使用 fs 模块,读写文件内容
 * 语法:
 * 1. 引入 fs 模块
 * 2. 调用 writeFile 写入内容
 * 3. 调用 readFile  读取内容
 */
const fs = require('fs') // 引入 fs 模块

fs.readFile('./text.txt',(err,data)=>{   // 调用 readFile  读取内容  data 是文件内容的 Buffer 数据流
    if (err) {
        console.log(err)        
    } else {
        // 读取出来的数据默认是Buffer数据流,得toString()转成字符串,用户能看懂
        console.log(data.toString())        
    }
})
// fs.writeFile('写入的文件','写入的内容',回调函数(err))
// 写入的数据,新的替换旧的 会覆盖原文件的所有内容;没有这个文件则自动创建这个文件
fs.writeFile('./text11.txt','我是鸿蒙6期的~~~',err=>{ // 写入内容
    console.log('恭喜写入成功')    
})

03.path 模块(绝对路径)

  • Node.js 执行 JS 代码时,代码中的路径都是以终端所在文件夹出发查找相对路径,而不是以我们认为的从代码本身出发,会遇到问题,所以在 Node.js 要执行的代码中,访问其他文件,建议使用绝对路径
  • path模块内置变量 __dirname配合 path.join() 来得到绝对路径使用
/**
 * 目标:读取 test.txt 文件内容
 * 注意:代码中,使用绝对路径
 * 原因:Node.js 执行时会以终端所在文件夹作为相对路径,去拼接代码中路径使用(导致找不到目标文件)
 * 解决:使用 path.join() 和 __dirname 来填写要查找的目标文件绝对地址
 */

const fs = require('fs')
const path = require('path')  // 引入path模块
fs.readFile(path.join(__dirname,'..','text.txt'),(err,data)=>{  // 读取
    if (err) {
        console.log(err)        
    } else {
        console.log(data.toString())        
    }
})

04.案例 压缩前端的html

/**
 * 目标一:压缩 html 里代码
 * 需求:把 public/index.html 里的,回车/换行符去掉,写入到 dist/index.html 中
 *  1.1 读取 public/index.html 内容
 *  1.2 使用正则替换内容字符串里的,回车符\r 换行符\n
 *  1.3 确认后,写入到 dist/index.html 内
 */
// 读取public里面的index.html→格式化压缩→压缩完的代码写入到dist里面的newIndex.html
// 读取文件fs模块+路径path
const fs = require('fs')
const path = require('path')
// 读取原html文件
// fs.readFile(文件,回调函数)
fs.readFile(path.join(__dirname, 'public', 'index.html'), (err, data) => {
    if (err) console.log(err)
    //  else console.log(data.toString())        
    const htmlStr = data.toString() // 代码→去掉回车换行\r\n→用正则找到\r\n替换成空字符
    const newStr = htmlStr.replace(/[\r\n]/g, '') // g表示替换所有的\r\n
    console.log(newStr)
    // 写入到新的html文件
    //  fs.writeFile(文件路径,要写入的内容,回调函数)
    fs.writeFile(path.join(__dirname, 'dist', 'newIndex.html'), newStr, (err) => {
        if (err) console.log(err)
        else console.log('恭喜,压缩成功')
    })
})

05.案例 压缩前端的js(压缩 js 里代码,并整合到 html 中一起运行)

/**
 * 目标二:压缩 js 里代码,并整合到 html 中一起运行
 *  2.1 读取 public/index.js 内容
 *  2.2 使用正则替换内容字符串里的,回车符\r 换行符\n 打印语句console.log('xxx');
 *  2.3 确认后,拼接 html 内容写入到 dist/index.html 内
 */
const fs = require('fs')
const path = require('path')
// 读取html文件
fs.readFile(path.join(__dirname, 'public', 'index.html'), (err, data) => {
  if (err) console.log(err)
  // else console.log(data.toString())
  const htmlStr = data.toString()
  const newStr = htmlStr.replace(/[\n\r]/g, '') //已经去掉\r\n的html代码
  // console.log(newStr) // 读取html成功

  // 读取js代码
  fs.readFile(path.join(__dirname, 'public/index.js'), (err, data) => {
    if (err) console.log(err)
    // else console.log(data.toString())
    //  有script标签再放js代码
    const myjs = data.toString()
    //代码→去掉\r\n;去掉log输出→把html和js拼一起写入到新html文件
    const jsStr = myjs.replace(/[\r\n]/g, '').replace(/console.log\('.+?'\);/g, '')
    // console.log(jsStr)      
    const newjs = `<script>${jsStr}</script>`  //带script标签的js

    // 把html文件和js一起写到其他文件夹
    // fs.writeFile(文件路径,写入的内容,回调函数)把html代码和js代码凭借到一起
    fs.writeFile(path.join(__dirname, './dist/new.html'), newStr + newjs, (err) => {
      if (err) console.log(err)
      else console.log('成功')
    })
  })
})

06.URL 端口号

/**
 * 目标:了解端口号的作用
 * 端口号:用于区分服务器中的不同服务程序
 * 取值范围:0-65535
 * 注意:0-1023 和一些特定端口号是被占用的,我们自己编写服务程序请避开使用
 *  1. URL 是统一资源定位符,简称网址,用于访问网络上的资源
    2. 端口号的作用:标记服务器里对应的服务程序,值为(0-65535 之间的任意整数)
    3. 注意:http 协议,默认访问的是 80 端口
    4. Web服务:一个程序,用于提供网上信息浏览功能
    5. 注意:0-1023 和一些特定的端口号被占用,我们自己编写服务程序请避开使用 * 
 * 
 */

07.http模块-创建Web服务

/**
 * 目标:使用 http 模块,创建 Web 服务
 * Web服务:一个程序,用于提供网上信息浏览服务
 * 步骤:
 *  1. 引入 http 模块,创建 Web 服务对象
 *  2. 监听 request 事件,对本次请求,做一些响应处理
 *  3. 启动 Web 服务监听对应端口号
 *  4. 运行本服务在终端,用浏览器访问 http://localhost:3000/ 发起请求(localhost 是本机域名)
 * 注意:终端里启动了服务,如果想要终止按 ctrl c 停止即可
 */
// 1.引入 http 模块,创建 Web 服务对象
const http = require('http')
// 创建web服务
const server = http.createServer()
// 发请求,返回响应结果
// server.on('request事件',回调函数)
server.on('request',(req,res)=>{

    // 设置响应头,内容类型,普通 html 文本:编码格式为 utf-8
    res.setHeader('Content-Type','text/html;charset=utf-8')
    res.end('你好,欢迎访问')
    // res.end('hallo')
})

// 启动 Web 服务监听对应端口号
// server.listen(端口号,回调函数)
server.listen(6656,()=>{
    console.log('web 服务已启动')
    
})

08.web服务 - 支持中文字符

/**
 * 目标:Web 服务支持中文字符
 * 问题:返回响应内容为,中文字符,浏览器无法正确显示
 * 原因:Web 服务没有设置响应头,指定说明内容类型和编码格式
 * 解决:设置响应头内容类型,让请求方能正确解析
 * 语法:res.setHeader('Content-Type', 'text/html;charset=utf-8')
 */

const http = require('http')
const server = http.createServer()
server.on('request', (req, res) => {
  res.end('你好,亲爱的世界') 
})
server.listen(3000, () => {
  console.log('Web 服务启动了')
})

09.案例 - 省份列表接口

/**
 * 目标:基于 Web 服务,开发-省份列表数据接口
 * 步骤:
 *  1. 创建 Web 服务
 *  2. 使用 req.url 获取请求的资源路径,读取 json 文件数据返回
 *  3. 其他请求的路径,暂时返回不存在的提示
 *  4. 运行 Web 服务,用浏览器请求地址查看效果
 */
const fs = require('fs')
 const http =  require('http')
const path = require('path')

//  创建web服务
const server = http.createServer()

// 3.发请求,监听请求,返回响应结果
server.on('request',(req,res)=>{
if(req.url ==='/api/provin'){
    // console.log('查询地址成功') 
    // 读取json文件里面的内容,响应给用户→ 中文 → 支持中文  → 设置响应头内容类型
    fs.readFile(path.join(__dirname,'data/province.json'),(err,data)=>{
        res.setHeader('content-type','application/json;charset=utf-8')
        res.end(data.toString()) //响应给用户
    })
}else{
    // console.log('请求地址错误,查无此地址')
    res.setHeader('content-type','text/html;charset=utf-8')
    res.end('不好意思,您访问的资源不存在') //响应给用户
}
})

// 4.监听某个端口号
server.listen(3333,()=>{
    console.log('服务器启动成功')
    
})

10.案例 - 城市列表接口

/**
 * 目标:基于 Web 服务,开发-城市列表数据接口
 * 步骤:
 *  1. 判断 req.url 资源路径+查询字符串,路径前缀匹配/api/city
 *  2. 借助 querystring 模块的方法,格式化查询参数字符串
 *  3. 读取 city.json 城市数据,匹配省份名字下属城市列表
 *  4. 返回城市列表,启动 Web 服务测试
 */
const fs = require('fs')
const path = require('path')
const http = require('http')
// const { queryObjects } = require('v8')
const qs = require('querystring')
//  创建web服务
const server = http.createServer()

// 03.发请求监听请求,返回响应结果
server.on('request',(req,res)=>{
  //判断条件-url是否以/api/city开头→是以这个开头的,拿到pname的值,去查找数据
  if(req.url.startsWith('/api/city')){
    console.log('地址正确')
    const str =req.url.split('?')[1]
    const pname = qs.parse(str).pname
    // console.log(pname)
    fs.readFile(path.join(__dirname,'data/city.json'),(err,data)=>{
      const result = JSON.parse(data.toString())[pname] // 数组,不能直接返回数组,返回json
      res.setHeader('content-type','application/json;charset=utf-8')
      res.end(JSON.stringify(result))
    })
    
  }else{
    res.setHeader('content-type','application/json;charset=utf-8')
      res.end('资源不存在')
    
  }
})

// 04.监听某个端口
server.listen(3333,()=>{
  console.log('服务启动成功')
  
})

11.案例-浏览时钟

/**
 * 目标:编写 web 服务,监听请求的是 /index.html 路径的时候,返回 dist/index.html 时钟案例页面内容
 * 步骤:
 *  1. 基于 http 模块,创建 Web 服务
 *  2. 使用 req.url 获取请求资源路径,并读取 index.html 里字符串内容返回给请求方
 *  3. 其他路径,暂时返回不存在提示
 *  4. 运行 Web 服务,用浏览器发起请求
 */
const http = require('http')
const fs = require('fs')
const path = require('path')
// 创建web服务
const server = http.createServer()

// 发请求监听请求,返回响应结果
server.on('request',(rep,res)=>{
    if(rep.url === '/index.html'){
        fs.readFile(path.join(__dirname,'dist/index.html'),(err,data)=>{
            res.setHeader('content-type','text/html;charset=utf-8')
            res.end(data.toString())
        })
    }else{
        res.setHeader('content-type','text/html;charset=utf-8')
         res.end('访问的资源不存在')
    }
})


// 
server.listen(3333,()=>{
    console.log('服务启动成功')
})

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

排序算法(7):堆排序

问题 排序 [30, 24, 5, 58, 18, 36, 12, 42, 39] 堆排序 堆排序是一种基于堆数据结构的排序算法。堆是一个近似完全二叉树的结构&#xff0c;即除了最后一层外&#xff0c;每一层都必须填满&#xff0c;且最后一层从左往右填充。 堆可以分为大根堆和小根堆。在大根堆中&…

操作系统如何管理进程所用的资源

PCB 操作内核的作用 进程与模式的切换 软中断——相当于审核——审核有没有访问权限什么的 操作系统以什么方式提供服务&#xff1f; 进程的创建和终止 线程 七状态图&#xff0c;挂起

罗德与施瓦茨NRP33SN,一款独立、特性齐全的功率探头

罗德与施瓦茨NRP33SN功率探头概述 ROHDE & SCHWARZ NRP33S 三路二极管功率传感器 罗德与施瓦茨 NRP33S 三路二极管功率传感器是一款独立 、特性齐全的仪器。它们可以通过罗德与施瓦茨 NRP2 基 本单元、通过 USB 的笔记本电脑/PC 以及许多罗德与施瓦 茨仪器&#xff08;例如…

uniapp自定义树型结构数据弹窗,给默认选中的节点,禁用所有子节点

兼容H5、安卓App、微信小程序 实现逻辑&#xff1a;给默认选中节点的所有子节点添加一个disabled属性&#xff0c;以此禁用子节点。 /components/sonTreeNode/sonTreeNode.vue 封装成组件 <template><view><view :class"[item,item.is_level1?pL1:item…

运维工程师面试系统监控与优化自动化与脚本云计算的理解虚拟化技术的优点和缺点

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c; 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把…

【GCC】2015: draft-alvestrand-rmcat-congestion-03 机器翻译

腾讯云的一个分析,明显是看了这个论文和草案的 : 最新的是应该是这个 A Google Congestion Control Algorithm for Real-Time Communication draft-ietf-rmcat-gcc-02 下面的这个应该过期了: draft-alvestrand-rmcat-congestion-03

web自动化测试知识总结

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、自动化测试基本介绍 1、自动化测试概述&#xff1a; 什么是自动化测试&#xff1f;一般说来所有能替代人工测试的方式都属于自动化测试&#xff0c;即通过工…

进程间通信方式---消息队列(System V IPC)

进程间通信方式—消息队列&#xff08;System V IPC&#xff09; 文章目录 进程间通信方式---消息队列&#xff08;System V IPC&#xff09;消息队列1.消息队列进程间通信原理2.msgget 系统调用3.msgsnd 系统调用4.msgrcv 系统调用5.msgctl 系统调用6.函数使用案例7.实现生产者…

python学opencv|读取图像(十七)认识alpha通道

【1】引言 前序学习进程中&#xff0c;我们已经掌握了RGB和HSV图像的通道拆分和合并&#xff0c;获得了很多意想不到的效果&#xff0c;相关链接包括且不限于&#xff1a; python学opencv|读取图像&#xff08;十二&#xff09;BGR图像转HSV图像-CSDN博客 python学opencv|读…

Unity Post请求发送fromdata数据content-type

wwwfrom 的 headers["Content-Type"]修改 错误代码&#xff1a; WWWForm form new WWWForm(); if (form.headers.ContainsKey("Content-Type")) {string boundary string.Format("--{0}", DateTime.Now.Ticks.ToString("x"));form…

服务平滑发布与线上验证

发布策略可分为&#xff1a; 蓝绿发布&#xff1a;将新版本服务器全部发好后&#xff0c;将旧版本服务器的流量统一切换到新版本上灰度发布&#xff08;金丝雀发布&#xff09;&#xff1a;是一种滚动发布方式&#xff0c;首先部署部分新版本服务器&#xff0c;将部分流量切到…

【数据安全】如何保证其安全

数据安全风险 数字经济时代&#xff0c;数据已成为重要的生产要素。智慧城市、智慧政务的建设&#xff0c;正以数据为核心&#xff0c;推动城市管理的智能化和公共服务的优化。然而&#xff0c;公共数据开放共享与隐私保护之间的矛盾日益凸显&#xff0c;如何在确保数据安全的…

ai论文生成器:分享8款AI一键生成论文的写作软件

在撰写毕业论文的过程中&#xff0c;高效利用各类软件工具可以极大地提升写作效率与质量。以下是八个免费的神器软件工具&#xff0c;它们各自在论文撰写、文献管理、语法校对、数据可视化等方面发挥着重要作用。希望这些推荐能帮助你顺利完成毕业论文的写作。 千笔AI论文&…

白话AI大模型(LLM)原理

大模型&#xff08;例如 GPT-4或类似的深度学习模型&#xff09;是基于神经网络的系统&#xff0c;用于理解、生成文本、图像或其他数据类型。其工作原理可以分为以下几个核心步骤&#xff0c;我将通过易于理解的例子逐一解释。 1. 神经网络的基本概念 大模型背后有一个非常庞…

数据压缩比 38.65%,TDengine 重塑 3H1 的存储与性能

小T导读&#xff1a;这篇文章是“2024&#xff0c;我想和 TDengine 谈谈”征文活动的三等奖作品之一。作者通过自身实践&#xff0c;详细分享了 TDengine 在高端装备运维服务平台中的应用&#xff0c;涵盖架构改造、性能测试、功能实现等多个方面。从压缩效率到查询性能&#x…

【Prometheus 】【实战篇(四)】Node Exporter安装方式(含一键安装脚本)及重要监控指标一览

目录 一、Node Exporter 1.8.2安装步骤详解1、下载 Node Exporter 安装包2、解压下载的文件3、将 Node Exporter 移动到 /usr/local/bin/4、创建一个专用的系统用户5、创建 systemd 服务文件6、重新加载 systemd 配置7、启动并启用 Node Exporter 服务8、检查 Node Exporter 状…

Qt之串口设计-线程实现(十二)

Qt开发 系列文章 - Serial-port&#xff08;十二&#xff09; 目录 前言 一、SerialPort 二、实现方式 1.创建类 2.相关功能函数 3.用户使用 4.效果演示 5.拓展应用-实时刷新 总结 前言 Qt作为一个跨平台的应用程序开发框架&#xff0c;在串口编程方面提供了方便易用…

信号处理相关的东东(学习解惑)

信号处理相关的东东&#xff08;学习解惑&#xff09; 所有内容学习自知乎专栏&#xff0c;https://www.zhihu.com/column/xinhao&#xff0c;写的很好&#xff0c;值得反复学习 时频域分析的一些常用概念 FROM&#xff1a;https://zhuanlan.zhihu.com/p/35742606 1、相加性…

使用 UniApp 在微信小程序中实现 SSE 流式响应

概述 服务端发送事件(Server-Sent Events, SSE)是一种允许服务器向客户端推送实时更新的技术。SSE 提供了一种单向的通信通道,服务器可以持续地向客户端发送数据,而不需要客户端频繁发起请求。这对于需要实时更新的应用场景非常有用。 流式传输的特点是将数据逐步传输给客…

【数据结构】八大排序

目录 一、直接插入排序 二、希尔排序 三、选择排序 四、堆排序 五、冒泡排序 六、快速排序 七、归并排序 八、计数排序 稳定性结论 稳定性&#xff1a;排序后相同元素之间的相对顺序是否保持不变。 一、直接插入排序 基本思想&#xff1a;通过构建有序序列&#xff…