Nodejs | 知识点

Node.js

Node.js是什么

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。
Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。

为什么要学Node.js

  1. 了解前后端交互流程
  2. 能够写api接口
  3. 了解后端开发的工作,方便交流
  4. 全栈工程师

    如何安装

    node.js官网下载程序包安装

    如何运行(REPL)

    1
    2
    node -v
    node hello.js

模块化

  • 内置模块(node.js中提供的可以直接调用)
  • 第三方模块
  • 自定义模块
    • 创建一个模块 (一个js文件是一个模块)
    • 导出一个模块 (module.exports=name)
    • 引用一个模块并且调用

      内置fs模块使用

      文件夹操作

  • 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()

    爬虫案例

  1. 获取目标网站内容

    • http.get(url,(res)=>{})
    • req.on(‘data’,(chunk)=>{})
    • req.end(()=>{})
  2. 分析网站内容

  3. 获取到有效信息并进一步操作

    • cheerio
      • 安装
      • $ = cheerio.load(内容字符串)
      • $(‘css 选择器’)

        邮箱验证码案例

  4. 安装nodemailer模块

    1
    npm install nodemailer -save
  5. 创建发送邮件的对象

    1
    let transporter = nodemailer.createTransport({})
  6. 发送邮件

    1
    transporter.sendMail({})

express框架

express基本介绍

基于 Node.js 平台,快速、开放、极简的 Web 开发框架(koa)

express基本使用

express安装

npm install express –save

express搭建web服务器

  1. 什么是web服务器

    Web服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,可以向浏览器等Web客户端提供文档,也可以放置网站文件,让全世界浏览;可以放置数据文件,让全世界下载。目前最主流的三个Web服务器是Apache、 Nginx 、IIS

  2. 代码实现
    1
    2
    3
    4
    5
    6
    7
    8
    9
    const 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
2
3
4
5
6
app.get('/api/user/list',(req,res)=>{

})
app.post('/api/user/login',(req,res)=>{

})

postman工具测试接口

下载postman软件并安装

中间件

第三方中间件(body-parser)

  1. 安装

    npm install body-parser –save

  2. 使用
    1
    2
    3
    const bodyParser = require('bodyParser')
    app.use(bodyParser.urlencoded({extended:false}))
    app.use(bodyParser.json())

自定义中间件(全局,局部)

1
2
3
4
5
6
7
8
9
10
11
// 全局中间件,请求任何路径将执行当前函数
app.use((req,res,next)=>{

})

// 局部中间件
app.get('/food',(req,res,next)=>{

},(req,res)=>{

})

静态资源目录设置

1
app.use('/public',express.static(path.join(__dirname,'./public')))

路由(express.Router)

当一个路径有多个匹配规则时,使用app.use(path,callback),否则使用相应的app.method(get、post)

1
2
3
4
5
6
7
8
9
// user.js
const router = require('express).Router()
router.get('/findAll',(req,res)=>{})
router.post('/login',(req,res)=>{})
module.exports = router

// server.js
const userRouter = require('./routers/user')
app.use('/user',userRouter)

mongodb

mongodb的介绍

MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统

mongodb的安装

  1. 下载 (百度mongodb)

    https://www.mongodb.com/download-center/community

  2. 安装
    • 最后一个对号不选
    • 缺少数据库文件 c/data/db
    • 不是内部的命令 需要设置环境变量 mongod 的bin 目录路径
  3. 命令行下运行 MongoDB 服务器(mongod –dbpath c:\db\data)
  4. 连接MongoDB(mongo)
  5. 配置 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
2
3
4
5
function test(){
return new Promise((reslove,reject)=>{

})
}

链式调用

1
xxx().then(data=>{}).then(data=>).catch()

node操作mongodb数据库

mongoose的安装

npm install mongoose –save

mongoose的使用

  1. 连接数据库

    1
    2
    3
    4
    5
    6
    7
    8
    9
    const 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('数据库服务器连接成功')
    })
  2. 创建文档结构对象

    1
    2
    3
    4
    5
    6
    const userSchema = new mongoose.Schema({
    username:{type:String,required:true},
    password:{type:String,required:true},
    age:Number,
    sex:{type:Number,default:1}
    })
  3. 创建数据模型对象

    1
    const userModel = mongoose.model('member',userSchema)
  4. 文档的curd

    1
    2
    3
    4
    5
    6
    userModel.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() //删除文档

登录、注册、发送验证码接口实现

  1. api接口实现
  2. 登录页面搭建
  3. 前端对接api接口,实现登录

apidoc生成api接口文档

  1. 安装

    1
    npm install apidoc -g
  2. 生成api文档

    在api接口文档中写注释
    生成apidoc文档(apidoc -i ./routers/ -o ./doc/)

上传图片

安装multer

npm install multer –save

使用multer

创建上传文件的接口

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
30
31
32
const router = require('express').Router()
const multer = require('multer)
const storage = multer.diskStorage({
destination(req,file,cb){
cb(null,'./uploads')
}
filename(req,file,cb){
cb(null,'保存文件的名称')
}
})
// 用于筛选哪些文件不用上传
function fileFilterFun(req,file,cb){
if(file.size > 82332){
cb(new Error('文件大小过大'))
}
cb(null,true)
}
const upload = multer({storage:storage,fileFilter:fileFilterFun}).single('file')

router.post('/upload/',(req,res)=>{
upload(req,res,err=>{
if(err){
res.send({error:1,msg:err.message})
}else{
let filePath = req.file.path.replace(/\\/g,'/')
let fileInfo = {
url:filePath
}
res.send({error:0,msg:'上成功',data:fileInfo})
}
})
})

对接上传文件的接口

将file对象封装到formData对象上
通过$.ajax请求上传文件接口,注意配置参数如下

1
2
3
4
5
6
7
8
9
$.ajax({
url: 'action',
type: 'POST',
data: formData,
//文件上传时必须配置的参数contentType和processData
contentType: false,
processData: false,
dataType: "json",//返回的数据格式
})

解决跨域问题

cors

  1. 安装cors

    1
    npm install cors --save
  2. 使用cors

    1
    2
    const cors = require('cors)
    app.use(cors()) // 全局允许跨域

使用代理

通过请求api接口文件所在的web服务作代理,后端不存在跨域的问题

  1. 安装request模块
1
npm install request --save
  1. 代理实现
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    app.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(会话)实现登录

  1. 安装express-session

    npm install express-session –save

  2. express-session的基本使用
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    const 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协议的通信流程

socket通信流程
// 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实现聊天室

  1. 实现服务端socket功能
  2. 实现客户端socket功能
  3. 运行两个端,开始聊天
  4. 知识点总结

    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请求次数,加速了页面初次渲染速度
  • 缺点: 不灵活,前后端耦合度太高

使用token方式验证用户登录

安装jsonwebtoken

利用jsonwebtoken封装创建token,验证token的方法

在服务端登录成功时产生token并将token发给客户端

客户端发送请求时带上token(可以放置在headers中)

在服务端取得token验证,token正确放行,否则报错

0%