一、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 代码中,相对路径是根据终端所在路径来查找的,可能无法找到你想要的文件
由于使用的是相对路径,它相对的是命令执行的路径,而不是当前文件所在的路径
最佳解决方案:使用绝对路径
语法:
-
加载 path 模块
const path = require('path') -
使用 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(`服务器启动成功了`)
})