Node.js
Node.js是什么
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。
Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。
为什么要学Node.js
- 了解前后端交互流程
- 能够写api接口
- 了解后端开发的工作,方便交流
- 全栈工程师
如何安装
node.js官网下载程序包安装
如何运行(REPL)
1
2node -v
node hello.js
模块化
- 内置模块(node.js中提供的可以直接调用)
- 第三方模块
- 自定义模块
- fs.readdir(),fs.readdirSync()
- fs.mkdir()
- fs.rmdir()
- fs.rename()
文件操作
- fs.writeFile()
- fs.appendFile()
- fs.readFile()
- fs.unlink()
- fs.stat()
内置url模块使用
- url.parse()
- url.format()
内置querystring模块的使用
- querystring.parse()
- querystring.escape()
爬虫案例
获取目标网站内容
- http.get(url,(res)=>{})
- req.on(‘data’,(chunk)=>{})
- req.end(()=>{})
分析网站内容
获取到有效信息并进一步操作
安装nodemailer模块
1
npm install nodemailer -save
创建发送邮件的对象
1
let transporter = nodemailer.createTransport({})
发送邮件
1
transporter.sendMail({})
express框架
express基本介绍
基于 Node.js 平台,快速、开放、极简的 Web 开发框架(koa)
express基本使用
express安装
npm install express –save
express搭建web服务器
- 什么是web服务器
Web服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,可以向浏览器等Web客户端提供文档,也可以放置网站文件,让全世界浏览;可以放置数据文件,让全世界下载。目前最主流的三个Web服务器是Apache、 Nginx 、IIS
- 代码实现
1
2
3
4
5
6
7
8
9const express = require('express)
const app = express()
app.get('/',(req,res)=>{
res.send('首页')
})
app.listen(8080,()=>{
console.log('web server start')
})
// 在浏览器中输入: localhost:8080
api接口
api接口理解
前端 : 1.写界面 2.请求数据 3.数据处理
后端 : 写 api接口
创建api接口
1 | app.get('/api/user/list',(req,res)=>{ |
postman工具测试接口
下载postman软件并安装
中间件
第三方中间件(body-parser)
- 安装
npm install body-parser –save
- 使用
1
2
3const bodyParser = require('bodyParser')
app.use(bodyParser.urlencoded({extended:false}))
app.use(bodyParser.json())
自定义中间件(全局,局部)
1 | // 全局中间件,请求任何路径将执行当前函数 |
静态资源目录设置
1 | app.use('/public',express.static(path.join(__dirname,'./public'))) |
路由(express.Router)
当一个路径有多个匹配规则时,使用app.use(path,callback),否则使用相应的app.method(get、post)
1 | // user.js |
mongodb
mongodb的介绍
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统
mongodb的安装
- 下载 (百度mongodb)
- 安装
- 最后一个对号不选
- 缺少数据库文件 c/data/db
- 不是内部的命令 需要设置环境变量 mongod 的bin 目录路径
- 命令行下运行 MongoDB 服务器(mongod –dbpath c:\db\data)
- 连接MongoDB(mongo)
- 配置 MongoDB 服务
mongodb常用命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29// 查看当前数据库
db
// 查看当前数据库操作命令的帮助
db.help()
// 查看所有数据库
show dbs
// 选择当前数据库(没有则自动创建)
use dbName
// 删除当前数据库
db.dropDatabase()
// 在当前数据库中创建集合
db.createCollection('集合名称')
// 删除当前集合名称
db.集合名称.drop()
// 查看所有集合
show collections
// 向集合中添加一个文档
db.集合名称.insert(对象)
// 查询集合中所有文档
db.集合名称.find()
// 查询集合中所有文档并格式化
db.集合名称.find().pretty()
// 更新满足条件的文档
db.集合名称.update({条件},{$set:{要修改的数据},{multi:true}})
// 用新文档替换已有的文档
db.集合名称.save({数据})
// 删除满足条件的文档
db.集合名称.remove({条件})
db.集合名称.find().skip(number).limit(number).sort({域名:-1|1})
promise
大量的异步操作 如果需要顺序执行 通过回调函数执行 回调
封装promise 函数
1 | function test(){ |
链式调用
1 | xxx().then(data=>{}).then(data=>).catch() |
node操作mongodb数据库
mongoose的安装
npm install mongoose –save
mongoose的使用
连接数据库
1
2
3
4
5
6
7
8
9const mongoose = require('mongoose')
mongoose.connect('mongodb://localhost/test',{useNewUrlParser:true})
const db = mongoose.connection
db.on('error',(err)=>{
console.log('数据库服务器连接失败')
})
db.on('open',()=>{
console.log('数据库服务器连接成功')
})创建文档结构对象
1
2
3
4
5
6const userSchema = new mongoose.Schema({
username:{type:String,required:true},
password:{type:String,required:true},
age:Number,
sex:{type:Number,default:1}
})创建数据模型对象
1
const userModel = mongoose.model('member',userSchema)
文档的curd
1
2
3
4
5
6userModel.insertMany([{},{}]).then().catch() //添加文档
userModel.find(条件).then().catch() //查找文档
userModel.updateOne(条件,{$set:{}}).then().catch() //修改一个文档
userModel.updateMany(条件,{$set:{}}).then().catch() //修改多个文档
userModel.deleteOne(条件}).then().catch() //删除文档
userModel.deleteMany(条件}).then().catch() //删除文档
登录、注册、发送验证码接口实现
- api接口实现
- 登录页面搭建
- 前端对接api接口,实现登录
apidoc生成api接口文档
安装
1
npm install apidoc -g
生成api文档
在api接口文档中写注释
生成apidoc文档(apidoc -i ./routers/ -o ./doc/)
上传图片
安装multer
npm install multer –save
使用multer
创建上传文件的接口
1 | const router = require('express').Router() |
对接上传文件的接口
将file对象封装到formData对象上
通过$.ajax请求上传文件接口,注意配置参数如下
1 | $.ajax({ |
解决跨域问题
cors
安装cors
1
npm install cors --save
使用cors
1
2const cors = require('cors)
app.use(cors()) // 全局允许跨域
使用代理
通过请求api接口文件所在的web服务作代理,后端不存在跨域的问题
- 安装request模块
1 | npm install request --save |
- 代理实现
1
2
3
4
5
6
7
8
9
10
11
12app.use('^/proxy',(req,res)=>{
// 凡是请求的接口以proxy开头的则转发到目标服务器
request({
url:'',
method:req.method,
body:req.body,
json:true,
},(err,response,body)=>{
// body是目标服务器返回的内容
res.send(body)
})
})
使用jsonp
原理是将客户端的js函数传递给后端,后端获取到此函数,传入前端需要的数据作为函数的参数调用,返回给客户端
注意: jsonp只支持get方式请求
session(会话)实现登录
- 安装express-session
npm install express-session –save
- express-session的基本使用
1
2
3
4
5
6
7
8
9
10
11
12
13const session = require('expess-session')
app.use(session({
secret:'',//签名的密钥
cookie:{
path:'/',
maxAge:60*60*1000
},
resave:true,// 即使 session 没有被修改,也保存 session 值,默认为 true
saveUninitialized:true //无论有没有session cookie,每次请求都设置个session cookie ,默认给个标示为 connect.sid
}))
// 配置后用req.session可以读写session数据
// req.session.destroy() 销毁当前会话数据
Socket
什么是Socket
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket(套字接),HTTP是轿车,提供了封装或者显示数据的具体形式; Socket(tcp/ip协议的封装)是发动机,提供了网络通信的能力。
Socket连接与HTTP连接的区别
HTTP是短连接,Socket(基于TCP协议的)是长连接。尽管HTTP1.1开始支持持久连接,但仍无法保证始终连接。而Socket连接一旦建立TCP三次握手,除非一方主动断开,否则连接状态一直保持。
HTTP连接服务端无法主动发消息,Socket连接双方请求的发送先后限制。这点就比较重要了,因为它将决定二者分别适合应用在什么场景下。HTTP采用“请求-响应”机制,在客户端还没发送消息给服务端前,服务端无法推送消息给客户端。必须满足客户端发送消息在前,服务端回复在后。Socket连接双方类似peer2peer的关系,一方随时可以向另一方喊话。
Socket基于tcp协议的通信流程
// net 模块(node.js自带的模块可以实现聊天室)
// websocket方式(需要现代浏览器才支持的协议,可以实现聊天室)
通过socket.io来实现socket编程
socket.io简介
node.js提供了高效的服务端运行环境,但是由于浏览器端对HTML5的支持不一,为了兼容所有浏览器,提供卓越的实时的用户体验,并且为程序员提供客户端与服务端一致的编程体验,于是socket.io诞生。Socket.io将Websocket和轮询 (Polling)机制以及其它的实时通信方式封装成了通用的接口,并且在服务端实现了这些实时机制的相应代码。
安装socket.io
npm install socket.io –save
使用socket.io实现聊天室
- 实现服务端socket功能
- 实现客户端socket功能
- 运行两个端,开始聊天
- 知识点总结
socket.on(‘自定义事件’,(msg)=>{}) 监听某事件,并且接收数据
socket.emit(‘自定义事件’,数据) 触发当前socket端的事件并传递数据
socket.broadcast.emit(‘自定义事件’,数据) 广播给所有socket端除了当前socket端以外
内置事件名有connection,disconnect,error(服务端socket、客户端都有)
服务端通过引入socket.io模块,将socket.io模块注入到当前web服务器中,再通过socket.io对象的on来监听connection事件
客户端socket通过引入socketlio客户端js文件,再通过io.connect(‘ip加端口’)来连接服务端
SSR渲染与BSR渲染的区别
任何的WEB项目基本的需要就是将后端的数据库中的数据渲染到页面上
BSR客户端渲染
- 优点:灵活,真正的前后端分离,方便于前后台各自更新维护
- 缺点: 对SEO不友好,增加了http请求次数,减缓了页面加载速度
SSR服务端渲染
- 优点: 对SEO友好,减少了http请求次数,加速了页面初次渲染速度
- 缺点: 不灵活,前后端耦合度太高