JavaScript语言在浏览器需要解析执行,浏览器的内核进行解析;浏览器的内核主要包括两部分:js引擎(解析器)和渲染引擎
js引擎负责解析并允许JavaScript代码
渲染引擎负责把HTML和CSS渲染成页面效果
浏览器除了提供js引擎之外,还提供了WebAPI(BOM、DOM...)
Node.js是什么?
nodejs是一个开发平台,这个平台上可以进行软件开发,并且开发出功能更加强大的软件(网站),并且在这个平台上进行开发很方便,因为nodejs提供了丰富的API和优秀的运行性能
在nodejs平台中开发语言使用的依然是JavaScript
Node.js可以做什么?
服务端Web开发,就是做网站(操作数据库)
java、Python、PHP、ruby、go、nodejs...
服务端后台接口API项目
桌面程序(基于eletron)
Typora
VSCode
Postman
命令行工具
App (IOS-swift/Android-java)
uniapp(vue)
react native
Node.js开发环境配置
关于命令行用法补充
命令行:操作计算机的一种方式;另一种是图形化界面
打开命令行三种方式
window + R,在出现的窗口中输入 cmd,回车
鼠标放到文件路径中,输入 cmd,回车
切换盘符命令:f: mac无盘符
cd 切换目录命令
cd .. 切上一层
cd ./文件名 切到当前路径下目录中
cd D:\my\code 切换到指定路径中
查看当前目录下的文件 dir
清屏: cls
创建文件夹: mkdir + 文件夹名称
安装配置Node.js环境
官网下载
安装
node -v 查看版本
Node.js体验
命令行窗口执行(输入node,出现 >)
退出命令行环境(两次 ctrl + c 或 .exit)
代码写到文件中运行
必须在js文件所在的目录中运行node命令
Node.js核心模块介绍
核心模块提供了开箱即用的丰富的API,方便开发项目时调用
文件操作(文件的读写操作)
网络通信(处理客户端请求并返回结果)
进程管理
...
fs模块,文件系统(File System)
操作系统(windows/mac/linux)的只要职能是管理硬件和软件硬盘,硬盘中的数据需要管理,由操作系统的文件系统进行管理;从编程的角度也可以通过API进行文件操作(读文件,写文件)
fs文件系统模块用于异步操作文件的方法
读取文件内容 fs.readFile
写入文件内容 fs.writeFile
fs文件系统模块用于同步操作文件的方法
读取文件内容 fs.readFileSync
写入文件内容 fs.writeFileSync
// 异步读写文件操作
// 读文件操作
// 1.导入模块(核心模块的名称是fs,固定的)
const fs = require('fs')
// 2.调用核心模块中的方法操作文件
// 参一:表示文件的路径
// 参二:表示读取内容的编码:utf-8
// 参三:表示读取文件成功的回调函数
fs.readFile('./文件名', 'utf-8', function(err, data) {
// err表示错误提示:如果err为null表示读取成功;否则表示错误提示
// data表示读取到的具体数据
if(err) {
console.log(err)
return
}
console.log(data)
})
// 写文件操作
// 1.导入核心模块
const fs = require('fs')
// 2.调用方法进行写文件(内存->硬盘)
const msg = 'Hi'
// 参一:写文件的路径
// 参二:写入的内容
// 参三:写入的文本的编码
fs.writeFile('./文件名', msg, 'utf-8', function(err){
// 写入成功与否的标志,null表示写入成功,否则表示错误信息
if(err === null) {
// 写入成功
console.log('写入文件成功')
}
})
// 同步读写文件操作
// 读文件操作
const fs = require('fs')
let res = fs.readFileSync('./文件名', 'utf-8')
console.log(res)
// 写文件操作
const fs = require('fs')
const msg = 'Hi'
fs.writeFileSync('./文件名', msg, 'utf-8')
console.log('成功写入')
path模块
node 提供了path模块用于简化路径的操作,路径的本质就是有格式的字符串
path.sep:自动检测平台环境,根据环境自动选择斜杠类型 ( \ 或 / )
path.join:拼接路径并且对路径进行规范化处理
// D:\my\code\文件
// /home/abc/hello/msg
const path = require('path')
const fs = require('fs')
// path.sep 作用:自动检测平台环境,根据环境自动选择斜杠类型
// windows \
// mac/linux/unix /
const res = fs.readFileSync(__dirname + path.sep + '文件名', 'utf-8')
// 拼接路径并且对路径进行规范化处理
const pstr = path.join(__dirname, '../文件名')
console.log(pstr)
const ret = fs.readFileSync(pstr, 'utf-8')
const str = path.join(__dirname, 'abc', '../xxx', 'bbb', 'index.js')
./ 表示命令行当前所处的路径
__dirname:表示当前执行的js文件所处的路径,node全局变量不用定义
// 如果希望命令行任何路径的位置之下都可以执行上述操作
const fs = require('fs')
const res = fs.readFileSync(__dirname + '/文件名', 'utf-8')
http模块
服务器提供web服务基本流程
关于请求对象req的两个属性的作用
req.url表示请求地址中的路径(端口后的部分)
req.method表示客户端的请求方式(GET|POST|PUT|DELETE)
后端可以根据这两个属性的组合分支判断实现多个接口
// 提供接口服务
// 1.导入核心模块
const http = require('http')
// 2.基于http模块提供的方法实现接口服务
// 2.1 创建一个服务器实例对象
const server = http.createServer()
// 2.2 监听端口(0~65535)
// 3000表示端口:端口用于区分电脑中的那个网络应用程序
server.listen(3000, function() {
// 监听成功后,该回调函数会执行
console.log('running...')
})
// 3.监听客户端发送的请求动作
// 如果客户想3000端口发送了请求,那么如下的事件request会触发对应的回调函数就会执行
server.on('request', function(req, res) {
// req 请求对象,用于处理请求相关信息
// res 响应对象,用于处理响应相关信息
res.end('hello world') // 响应客户端请求的结果
})
// 接口服务细节分析
server.on('request', function(req, res) {
// req.url表示请求地址中的路径(端口后的部分)
// req.method表示客户端请求的方式(GET|POST|PUT|DELETE)
if(req.url === '/getbooks' && req.method === 'GET') {
// 查书
res.end('getbooks')
} else if(req.url === '/addbook' && req.method === 'POST') {
// 添加图书
res.end('addbook')
} else if(req.url === '/delbook' && req.method === 'GET') {
// 删书
res.end('delbook')
} else {
res.end('not found!')
}
})
服务器介绍
职能:提供服务(网页服务,视频服务,音频服务,邮箱服务...)数据接口服务
大量的数据资源需要存储在服务器中,客户端要想看到,需先请求对应资源加载到客户端才能呈现
客户端请求时,服务器的这些资源是如何返回给客户端的?
文件读取;文件写入-上传文件
服务器如何处理客户端请求?
需要协议,对于这些协议,Node.js实现了相关的API,从而处理请求
原生nodejs提供接口服务
接口服务主要有两个核心流程:处理网络通信、文件读写操作
文件 books.txt
[
{
"id": 1,
"bookname": "node深入浅出",
"author": "朴灵",
"publisher": "人民邮电出版社"
}
]
文件 myserver.js
// 1.导入核心模块
const http = require('http')
const path = require('path')
const fs = require('fs')
// 2.基于http模块提供的方法实现接口服务
// 2.1 创建一个服务器实例对象
const server = http.createServer()
// 2.2 监听端口
server.listen(3000, function() {
console.log('3000, running...')
})
// 3.监听客户端发送的请求动作
server.on('request', function(req, res){
if() {
const filePath = path.join(__dirname, './books.txt')
res.setHeader('Content-type', 'application/json; charset=utf8')
fs.readFile(filePath, 'utf-8', function(err, data) {
if(err) {
// 读取失败
res.end('server error')
return
}
// 正常返回数据
res.end(JSON.stringify({
code: 0,
msg: '获取图书列表成功',
data: data
}))
})
}
...
})
设置响应数据的格式和编码
设置响应头:告诉浏览器服务器返回的数据格式和编码是什么情况
res.setHeader('Content-type', 'application/json; charset=utf8')
删除图书接口 localhost:3000/delbook?id=1
读取原始文件
删除数据(处理)
写回处理后结果到文件
else if(req.url.indexOf('/delbook') === 0 && req.method === 'GET') {
// req.url = /delbook?id=1
// 获取要删除的图书的id
let id = null
if(req.url.indexOf('id=') !== -1) {
id = req.url.substring(req.url.lastIndexOf('=') + 1)
}
if(id === null) {
// 前端没有传递id值
res.end('请传递图书id')
return
}
// 删除图书
// 1.读取所有的文件数据,到变量(内存)中
const filePath = path.join(__dirname, './books.txt')
const books = fs.readFileSync(filePath, 'utf-8')
// 2.把读取到的数据删除一条(根据id删除)
let booksArr = JSON.parse(books)
booksArr = booksArr.filter(function(item) {
return item.id !== parseInt(id)
})
// 3.把剩余的数据写回文件中
fs.writeFileSync(filePath, JSON.stringify(booksArr), 'utf-8')
// 4.返回状态信息
res.end(JSON.stringify({
code: 0,
msg: '删除图书成功'
}))
} else {
res.end('not found!')
}
总结:监听前端请求,操作文件、响应状态
获取请求参数
删除流程:读文件;操作数组;写文件