Nodejs | 知识点

Node.js

Node.js是什么

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

为什么要学Node.js

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

如何安装

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

如何运行(REPL)

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 选择器')

邮箱验证码案例

  1. 安装nodemailer模块
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服务器

  1. 什么是web服务器

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

  1. 代码实现
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接口

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

postman工具测试接口

下载postman软件并安装

中间件

第三方中间件(body-parser)

  1. 安装

npm install body-parser --save

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

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

// 全局中间件,请求任何路径将执行当前函数
app.use((req,res,next)=>{
    
})

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

},(req,res)=>{

})

静态资源目录设置

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

路由(express.Router)

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

// 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

  1. 安装
    • 最后一个对号不选
    • 缺少数据库文件 c/data/db
    • 不是内部的命令 需要设置环境变量 mongod 的bin 目录路径
  2. 命令行下运行 MongoDB 服务器(mongod --dbpath c:\db\data)
  3. 连接MongoDB(mongo)
  4. 配置 MongoDB 服务

mongodb常用命令

// 查看当前数据库
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 函数

function test(){
    return new Promise((reslove,reject)=>{

    })
}

链式调用

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

node操作mongodb数据库

mongoose的安装

npm install mongoose --save

mongoose的使用

  1. 连接数据库
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('数据库服务器连接成功')
})
  1. 创建文档结构对象
const 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)
  1. 文档的curd
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. 安装
npm install apidoc -g
  1. 生成api文档

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

上传图片

安装multer

npm install multer --save

使用multer

创建上传文件的接口

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请求上传文件接口,注意配置参数如下

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

解决跨域问题

cors

  1. 安装cors
npm install cors --save
  1. 使用cors
const cors = require('cors)
app.use(cors()) // 全局允许跨域

使用代理

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

  1. 安装request模块
npm install request --save
  1. 代理实现
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

  1. express-session的基本使用
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正确放行,否则报错

posted @ 2022-06-29 22:47  ^finally  阅读(59)  评论(0)    收藏  举报