Node.js第一天
Node.js的定义
Node.js 是一个基于 Chrome V8 引擎 的 JavaScript 运行时环境
中文网Nodejs.cn/
Node.js作用
Node.js是JS的后端运行环境
提供文件读写能力 提供数据库读写能力 提供Web服务器 拓宽前端开发能力,用于开发小程序、桌面应用、原生App、后端开发
Node.js环境
是由ECMAScript + 内置模块(fs, http, path等) + 第三方模块(别人开发的模块)
注意:NodeJS中没有DOM,也没有BOM,也没有window对象
浏览器是JS的前端运行环境,Node.js是JS的后端运行环境
常用的命令及按键
node 空格 某个js文件 重要// 调用 node 程序,运行某个js文件
clear 或者 cls 重要// 清空界面
ls/list/dir 重要// 查看列表(list)
cd 目录名 // 进入到目录中去
cd .. // 返回上一级目录
cd \ // 直接回到根目录
Ctrl+C 重要// 停止 Node 程序
输入部分文件名后按下 Tab 键 重要// 补全文件名 或 目录名, 多次tab会进行切换
↑ ↓ 上下箭头 重要// 切换历史输入
Node中的模块分类
核心模块
核心模块就是 Node 内置的模块,需要通过唯一的标识名称来进行获取。每一个核心模块基本上都是暴露了一个对象,里面包含一些方法供我们使用。一般在加载核心模块的时候,变量(或常量)的起名最好就和核心模块的标识名同名。
使用require导入模块
// const 变量名 = require('模块名')
// 建议:变量名 和 模块名保持同名
注意:
console.log('window', window) // BOM 对象,❌ 报错 window is not defined
console.log('document', document) // DOM 对象,❌报错 document is not defined
// 🎯总结:Node 环境不能调用 DOM 和 BOM (DOM和BOM是属于浏览器的,Node不是浏览器)
fs模块异步读取文件基本写法
异步读取
语法:fs.readFile(path[, options], callback)
参数:path,读取文件的路径(相对路径或绝对路径) options:读取文件的参数配置,通常用一个utf8字符串表示即可 callback:读取完毕的回调函数(err,data)=>{}
和同步相反,也就是在发出一个功能调用时,不管没有没得到结果,都继续往下执行。 就像两个人吵架一样,各说各的,不管对方有没有说完。 优缺点:不会造成阻塞,提升了程序执行性能,用户体验好,缺点是编程方式复杂,执行过程理解难度较大,会形成回调函数的嵌套。
异步的表现形式:以一个回调函数的方式来实现异步任务的执行
// err 错误对象,如果读取文件成功 err 的 值为 null
// data 读取到的数据,如果读取失败 data 的值为 undefined
在根文件夹下 创建 /异步读取文件/rd.js 和 /异步读取文件/1.txt两个文件
在1.txt中随便输入一个内容
// 🎯总结:err 和 data 都是二选一
fs.readFile('./1.txt', (err, data) => {
console.log('err', err)
console.log('data', data)
})
异步读取文件处理错误
(err,data)=>{ } 中有两个参数 参数1:err代表读取文件出错后的错误对象 参数2:data代表读取文件成功后的内容,如果读取失败则data的值为为undefined
如果err参数的值为null则表示读取文件成功,此时data中存储的就是读取文件中的内容
如果err参数的值不为null,则表示读取文件失败,err保存了错误对象,我们可以通过阅读错误信息去了解具体的错误原因,此时data参数的值为undefined
writeFile异步写入内容
列如:一个js文件中编写代码,将一段文本写入到同级目录下的1.txt文件中
1、在day01文件夹下 创建 /异步覆盖写入文件/wd.js 和 /异步覆盖写入文件/1.txt两个文件
2、在wd.js中导入fs核心模块 const fs = require(‘fs’) 3、fs.writeFile(‘./1.txt’,’白日依山尽’,’utf8’,(err)=>{ consloe.log(‘写入成功’); }) 4、进入异步覆盖写入文件目录打开小黑窗,执行 node wd.js 看结果
异步写入对象格式
const fs = require('fs')
const list = [{ id: 1 }, { id: 2 }]
🚨注意事项:
fs.writeFile() 第二个参数的格式要求为:字符串
JSON.stringify() 把对象转换成:JSON字符串
fs.writeFile('./data.json', JSON.stringify(list), err => {
if (err) return console.log('写入错误')
console.log('写入成功')
})
fs模块同步读取文件
多个功能按先后顺序执行,后面任务等待前面任务执行完毕后才会执行。 如平常大家讨论问题时说:让我说完,意思是说我说完你再说。 优缺点:如果前面任务执行太久会阻止后面任务的执行,降低程序执行性能,造成用户体验差,优点是编程方式简单,便于理解执行过程。
fs.readFileSync同步读取文件基本写法或同时读取图片
语法:let res = fs.readFileSync(path[, options])
//Sync 同步的意思,按书写顺序执行
console.log(111)
const data = fs.readFileSync('./1.txt')
console.log('文本', data.toString())
console.log(222)
同步读取文件处理错误
同步代码的错误处理使用try{}catch(){}处理,
try中写正常逻辑的代码,try中的代码出错后就会触发catch中的代码
// fs.readFile()
// Sync 同步的意思,按书写顺序执行
举列:try {
const data = fs.readFileSync('./123.txt')
console.log(data.toString())
} catch (error) {
console.log('读取文件失败了', error.message)
}
// try {
// // 业务代码
// } catch (error) {
// // 如果业务代码出错,catch 结构会捕获到错误
// }
fs.writeFileSync同步写入文本内容到文件
// 如果要处理失败的情况,其实同步写起来反而更麻烦(了解即可)
try {
fs.writeFileSync('E:/1.txt', '准备下课')
console.log('写入成功')
} catch (error) {
console.log('写入失败')
}
web服务器
http是nodejs的核心模块,它能让我们能够通过简单的代码创建一个Web服务器,处理http请求。
web服务器:
- 用户通过浏览器来享受web服务器提供的服务
- 我们用url地址来访问某个web服务器上的资源
- 浏览器端发起请求,web服务器收到请求后,响应这个请求,并将处理结果返回给浏览器
ip地址
-
全称:
InternetProtocol Address。作用:标识一个网络设备(计算机、手机、电视)在某一个具体的网络当中的地址。要访问某个电脑上的资源,先要找到它的ip。
分类:ipV4 ipV6 (www.gov.cn/xinwen/2018…)
格式:
[0-255].[0-255].[0-255].[0-255]即为四个 0-255 的数字组成(以ip4为例)。在同一个网络中,计算机的IP是不允许相同的,都是唯一的。127.0.0.1 特指本机ip地址。(只能自己访问)
192.168.106.2 (这种地址叫做局域网地址)(可以在当前局域网中的所有电脑都可以访问)
这个 http://220.181.38.149/ (外网IP)会指向哪里?(在整个互联网上都可以访问)
域名
域名:ip地址的别名,由于ip地址不好记忆,我就给它们取个好记的别名。localhost这个域名特指127.0.0.1这个地址。
域名解析系统:把域名翻译成Ip地址的系统。
端口
一个IP地址的端口可以有65536个,范围是从[0,65535])。不同的端口被不同的软件占用,以提供不同的服务。
res.end()设置响应体
语法:res.end(响应的数据) end()只能传入buffer或者是String类型的数据
res.setHeader()设置响应头解决中文乱码
作用:设置响应头信息,控制浏览器的一些行为 语法:res.setHeader(响应头,响应值),两个参数的具体值都是http协议规定的 用法:在createServer的回调函数中使用
注意: res.setHeader()在res.end()之前才有效 res.setHeader()可以设置多次
解决响应中文字符在浏览器显示成乱码问题:
res.setHeader('content-type', 'text/html;charset=utf8')
content-type作用
在请求头中设置content-type来告诉服务器,本次请求携带的数据是什么类型的 在响应头中设置content-type来告诉浏览器,本次返回的数据是什么类型的 res.setHeader方法可以设置content-type这个响应头,浏览器根据不同类型做出不同解析
Http模块创建Web服务器
引入核心模块require('http'),得到的http是一个对象
http.createServer方法创建一个http服务 createServer方法参数是一个回调函数:当有http请求进来时,它会自动被调用,请求一次,它就被调用一次
第一个参数:客户端的请求。
第二个参数:设置对本次请求的响应。
res.end() :设置响应体,结束请求。
req参数:客户端的请求相关数据 res参数:设置对本次请求的响应相关数据 server.listen() 用来监听端口
格式:server.listen(端口号,[回调函数]) 。回调是可选的。
如果监听成功,则回调函数会执行一次。 如果不成功(例如端口被占用),会报错。
// 1. 导入 http 模块
const http = require('http')
// 2. 创建服务(类似于后端的事件)
// 重点注意两个参数:
// req request 请求(对象)
// res response 响应(对象)
const server = http.createServer((request, response) => {
console.log('接收到了客户端请求')
response.end('OK')
})
// 3. 开启监听
server.listen(8001, () => {
console.log('服务器启动成功提示')
})
根据不同的url响应不同内容
// 1. 导入 http 模块
const http = require('http')
// 2. 创建服务(类似于后端的事件)
const server = http.createServer((req, res) => {
// 🖥️req 请求对象
// req.method 获取请求方式
// req.url 获取请求地址
console.log('服务器接收到请求', req.method, req.url)
if (req.url === '/') {
res.end('Hello Index')
} else if (req.url === '/joke') {
// 服务器告诉浏览器,响应的内容类型为: 文本,编码格式为 utf8
res.setHeader('content-type', 'text/html;charset=utf8')
// 作业:返回随机一个笑话
res.end('哈哈哈~')
} else {
// 📤res 响应对象
res.end('404')
}
// 🚨 多个 res.end 被调用会导致服务器崩溃
// res.end('404')
})
// 3. 开启监听
server.listen(8001, () => {
console.log('服务器启动成功提示')
})