Node一、fs 模块、path 模块、端口号、 http 模块、

一、Node.js了解

Node.js是一个跨平台JavaScript运行环境,使开发者可以搭建服务器端的JavaScript应用程序。
概念:使用 Node.js 编写后端程序 / 支持前端工程化

后端程序:提供接口和数据,网页资源等

前端工程化 : 对代码压缩,转译,整合(使用各种工具,提升效率)
Node.js与浏览器环境的JS最大区别:

Node.js 环境中没有BOM和 DOM,但也是用JS 语法
Node.js 如何执行代码
在VSCode 终端中输入:nodexxxjs回车即可执行(注意路径)

1.终端

终端作用:敲击命令,调用对应程序执行

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

    console.log(i)

}

二、fs 模块 - 读写文件

模块:类似插件,封装了方法/属性
fs 模块:封装了与本机文件系统进行交互的,方法/属性
语法:

1. 加载 fs 模块
const fs = require('fs') fs 模块标识符:模块的名字

2. 写入 文件内容
fs.writeFile('写入的文件','写入的内容',回调函数(err) )
写入的数据新的替换旧的;没有这个文件则自动创建这个文件

3. 读取 文件内容
fs.readFile('文件路径',回调函数(err,data)) data是读取的文件内容,Buffer数据流
获取城市列表-接口开发

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

//fs.readFile(文件路径,回调函数(err,data))
fs.readFile('./text.txt', (err, data) => {
    if (err) {
        console.log(err)

    } else {
        // Buffer 是数据流, 因为在磁盘上读取的数据就是由二进制组成的, 我们平时看到的数据都是有编码的

        //硬盘中的文件可能是各种各样的数据:文本/视频/音频

        //读取出来的数据默认是Buffer数据流,得toString()转成字符串,用户能看懂node
        console.log(data.toString())

    }
})

// fs.writeFile(写入的文件,写入的内容,回调函数(err) )
//写入的数据新的替换旧的;没有这个文件则自动创建这个文件
fs.writeFile('./text11.txt', '我是鸿蒙6期', (err) => {
    console.log('写入成功')

})
fs.writeFile('./text.txt', '今天学习node', (err) => {


})

三、path 模块 - 路径处理

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

由于使用的是相对路径,它相对的是命令执行的路径,而不是当前文件所在的路径

最佳解决方案:使用绝对路径

语法:

  1. 加载 path 模块
    const path = require('path')

  2. 使用 path.join 方法,拼接路径

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

__dirname

当前文件所在的目录(绝对路径)

javascript 复制代码
/**
 * 目标:读取 test.txt 文件内容
 * 注意:代码中,使用绝对路径
 * 原因:Node.js 执行时会以终端所在文件夹作为相对路径,去拼接代码中路径使用(导致找不到目标文件)
 * 解决:使用 path.join() 和 __dirname 来填写要查找的目标文件绝对地址
 */

const fs = require('fs')
const path = require('path')

// console.log(__dirname) //03.  当前js所在的位置

// __dirname 内置全局变量,表示当前文件所在的目录(绝对路径)

// 由于使用的是相对路径, 它相对的是命令执行的路径, 而不是当前文件所在的路径
// 最佳解决方案: 使用绝对路径
fs.readFile(path.join(__dirname, '..', 'text2.txt'), (err, data) => {
    if (err) console.log(err)
    else console.log(data.toString())
})

案例- 压缩前端 html+ JS

javascript 复制代码
/**
 * 目标二:压缩 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')

const fs = require('fs')
const path = require('path')

// 读取html替换掉\r\n
fs.readFile(path.join(__dirname, 'public', 'index.html'), (err, data) => {

    if (err) console.log(err)
    const htmlStr = data.toString()
    const newStr = htmlStr.replace(/[\r\n]/g, '') //已经去掉\r\n的html代码
    console.log(newStr) //读取html成功

    //读js代码
    fs.readFile(path.join(__dirname, 'public/index.js'), (err, data) => {
        if (err) console.log(err)
        const myjs = data.toString() //代码→去掉\r\n;去掉1og输出→把html和js拼一起写入到新html文件

        // +所有量词默认都是贪婪模式
        // 贪婪模式: 匹配到之后还会继续匹配,如果后续依然有相同的字符,才会结束匹配,中间的所有字符都会匹配上
        // 关闭贪婪模式: 只需要在量词后面加一个?

        //  +重复一次或更多次,   ?重复零次或一次,   g全局匹配  .表示任意字符
        // console.log(jsStr)
        const jsStr = myjs.replace(/[\r\n]/g, '').replace(/console.log\('.+?'\);/g, '')

        //有script标签再放js代码
        const result = `<script>${jsStr}</script>`

        //fs.writeFile(文件路径,写入的内容,回调函数)把html代码和js代码凭借到一起
        fs.writeFile(path.join(__dirname, 'dist/newindex.html'), newStr + result, (err) => {
            if (err) console.log(err)
            else console.log(`恭喜,压缩成功`)

        })
    })

})

四、URL 中的端口号

URL: 统一资源定位符,简称 网址 ,用于访问网络上的资源
端口号:标记服务器里对应服务程序(0-65535 的整数)
Web 服务 :一个程序,用于提供网上信息浏览功能
注意:0-1023 和一些特定端口号被占用,我们自己编写服务程序请避开使用

注意:http 协议,默认访问 80 端口

五、 http 模块

1.创建服务器程序

步骤:
1. 引入 http 模块 ,创建 Web 服务对象
const http = require('http')
const server = http.createServer( )
2. 监听 request 请求事件,对本次请求,做一些响应处理
server.on('request事件',回调函数)
req=request 参数1:req请求对象,这一次用户请求的信息
res=response 参数2: res响应对象,这一次要响应给用户的信息
3. 启动 Web 服务监听对应端口号
4. 运行本服务在终端,用浏览器发起请求

server.listen(端口号,回调函数)

javascript 复制代码
/**
 * 目标:使用 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()


// 2.监听 request 事件, 对本次请求, 做一些响应处理
//发送请求拿到结果  server.on('request事件',回调函数)
// http请求是指一次请求一次响应
// req=request  参数1:req请求对象,这一次用户请求的信息
// res=response  参数2:res响应对象,这一次要响应给用户的信息
server.on('request', (req, res) => {
    // res.end(返回的响应结果)
    // //设置响应头的内容类型---text/html表示的是html的文本类型;charset=utf-8设置字符编码-万国码
    res.setHeader('content-type', 'text/html;charset=utf-8')
    res.end('欢迎使用本服务器')
        // res.end('hello web')
})

// 3.监听
// server.listen(端口号,回调函数)
server.listen(3001, () => {
    console.log(`web服务已经启动成功`)

})

二、支持中文字符

给响应头添加内容类型

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

const http = require('http')
const server = http.createServer()
server.on('request', (req, res) => {

//设置响应头,内容类型,普通html文本;编码格式为utf-8
res.setHeader('Content-Type','text/html;charset=utf-8')

res.end('你好,亲爱的世界')
3)
server.listen(3000,O =>{
console.1og('web服务已启动')
3)

案例

1.获取省份列表-接口开发

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


//3发送请求,监听请求,返回响应结果
server.on('request', (req, res) => {
    if (req.url === '/apc/province') {
        // 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(3011, () => {
    console.log(`服务器启动成功了`)
})

2.获取城市列表-接口开发

querystring 模块的方法,格式化查询字符串

javascript 复制代码
/**
 * 目标:基于 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 qs = require('querystring')

const server = http.createServer()
server.on('request', (req, res) => {

    //判断条件-url是否以/api/city开头→是以这个开头的,拿到pname的值,去查找数据
    if (req.url.startsWith('/apc/city')) {
        //以/api/city开头的情况
        // console.log(`地址正确`)

        //把省份名字拿出来→读取city.json的内容→从读取的内容中按省份名字查找数据·
        //console.log(req.url.split('?')[1])//split字符串分割成数组
        const str = req.url.split('?')
        console.log(str)

        console.log(qs.parse(str)) //{pname:省份名字}--queryString的格式化
        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]
            res.setHeader('constent-type', 'application;charset=utf-8')
            res.end(JSON.stringify(result))
        })

    } else {
        //路径不正确的情况
        // console.log(`地址错误`)
        res.end('资源不存在')
        res.setHeader('constent-type', 'application;charset=utf-8')
    }
})


//监听某个端口号
server.listen(3011, () => {
    console.log(`服务器启动成功了`)

})

3.浏览时钟

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


const server = http.createServer()
    //监听请求和响应
server.on('request', (req, res) => {
    if (req.url === '/index.html') {
        console.log('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(3011, () => {
    console.log(`服务器启动成功了`)

})
相关推荐
半个西瓜.28 分钟前
网络安全:基线检查---自动化脚本检测.
网络·安全·web安全·网络安全·安全威胁分析
运维小文1 小时前
TCP协议简单分析和握手挥手过程
服务器·网络·网络协议·tcp/ip·三次握手
xtggbmdk1 小时前
三层交换机和路由器的连接方式有三种:
网络·智能路由器
gywl1 小时前
计算机网络-应用层
服务器·网络·计算机网络
光明编码使者1 小时前
WebSocket 与 Server-Sent Events (SSE) 的对比与应用
网络·websocket·网络协议
文中金域1 小时前
websocket 服务 pinia 全局配置
网络·websocket·网络协议·vue
p-knowledge2 小时前
容器设计模式:Sidecar
网络协议·设计模式·rpc
艾德金的溪2 小时前
ES(elasticsearch)端口漏洞处理
服务器·网络·elasticsearch
神的孩子都在歌唱3 小时前
你知道OSI参考模型是什么吗?
网络·网络安全
earthzhang20213 小时前
《深入浅出HTTPS》读书笔记(19):密钥
开发语言·网络协议·算法·https·1024程序员节