Node.js基础(二)

devtools/2024/10/18 14:45:03/

1. NodeJs操作Mongodb

1.1. 连接数据库

const mongoose = require("mongoose")
mongoose.connect("mongodb://127.0.0.1:27017/company-system")

1.2. 创建模型

const mongoose = require("mongoose")
const Schema = mongoose.Schemaconst UserType = {username:String,password:String,gender:Number,introduction:String,avatar:String,role:Number
}
const UserModel = mongoose.model("user",new Schema(UserType))
module.exports  = UserModel 

1.3. 增加数据

UserModel.create({introduction,username,gender,avatar,password,role
})

1.4. 查询数据

UserModel.find({username:"wyb"},["username","role","introduction","password"]).sort({createTime:-1}).skip(10).limit(10)

1.5. 更新数据

UserModel.updateOne({ _id },{ introduction,username,gender,avatar })

1.6. 删除数据

UserModel.deleteOne({_id})

2. 登录鉴权

2.1. Cookie && Session

在这里插入图片描述

const express = require("express");
const session = require("express-session");
const MongoStore = require("connect-mongo");
const app = express();app.use(session({secret: "this is session", // 服务器生成 session 的签名resave: true, saveUninitialized: true, // 强制将为初始化的 session 存储cookie: {maxAge: 1000 * 60 * 10,// 过期时间secure: false, // true:只有 https 协议才能访问cookie},rolling: true, // true:超时前刷新,cookie 会重新计时;false:在超时前刷新多少次,都是按照第一次刷新开始计时。store: MongoStore.create({mongoUrl: 'mongodb://127.0.0.1:27017/kerwin_session',ttl: 1000 * 60 * 10 // 过期时间}),})
);app.use((req,res,next)=>{if(req.url==="/login"){next()return;}if(req.session.user){req.session.garbage = Date();next();} else{res.redirect("/login")   }
})

2.2. JSON Web Token (JWT)

在这里插入图片描述

  • 代码实现
//jsonwebtoken 封装
const jsonwebtoken = require("jsonwebtoken")
const secret = "wyb- secret"
const JWT = {generate(value, exprires){return jsonwebtoken.sign(value, secret, {expiresIn: exprires})},verify(token){try {return jsonwebtoken.verify(token, secret)} catch(e) {return false}}
}
module.exports = JWT
//node中间件校验
app.use((req,res,next)=>{// 如果token有效 ,next() // 如果token过期了, 返回401错误if(req.url==="/login"){next()return;}const token = req.headers["authorization"].split(" ")[1]if(token) {const payload = JWT.verify(token)if(payload) {const newToken = JWT.generate({_id: payload._id,username: payload.username}, "1d")res.header("Authorization", newToken)next()} else {res.status(401).send({errCode: "-1", errorInfo: "token过期"})}}
})
// 生成token
const token = JWT.generate({_id: result[0]._id,username: result[0].username
}, "1d")
res.header("Authorization", token)

3. 文件上传管理

Multer 是一个 node.js 中间件,用于处理 multipart/form-data 类型的表单数据,它主要用于上传文件。

const params = new FormData()
params.append('wybfile', file.file)
params.append('username', this.username)
const config = {headers: {"Content-Type":"multipart/form-data"}
}
http.post('/api/upload', params, config).then(res => {this.imgpath = 'http://localhost:3000' + res.data
})	

Multer 会添加一个 body 对象 以及 filefiles 对象 到 express 的 request 对象中。 body 对象包含表单的文本域信息,filefiles 对象包含对象表单上传的文件信息。

  • 后端
router.post('/upload', upload.single('wybfile'),function(req, res, next) {console.log(req.file)
})

4. 操作MySQL

const express = require('express')
const app = express()
const mysql2 = require('mysql2')
const port = 9000app.get('/', async (req, res) => {const config = getDBConfig()const promisePool = mysql2.createPool(config).promise();let user = await promisePool.query('select * from students');if (user[0].length) {// 存在用户res.send(user[0])} else {// 不存在res.send( {code: -2,msg: 'user not exsit',})}      
})
app.listen(port, () => {console.log(`Example app listening at http://localhost:${port}`)
})function getDBConfig() {return {host: '127.0.0.1',user: 'root',port: 3306,password: '',database: 'wyb_test',connectionLimit: 1 // 创建一个连接池}
}
查询:promisePool.query('select * from users');
插入:promisePool.query('INSERT INTO `users`(`id`,`name`,`age`, `password`) VALUES (?,?,?,?)',[null,"kerwin",100,"123456"]);
更新:promisePool.query(`UPDATE users SET name = ? ,age=? WHERE id = ?`,["xiaoming2",20,1])
删除:promisePool.query(`delete from users where id=?`,[1])

5. Socket编程

5.1. ws模块

  • 服务端
const  WebSocket = require("ws")
WebSocketServer = WebSocket.WebSocketServer
const wss = new WebSocketServer({ port: 8080 });wss.on('connection', function connection(ws) {ws.on('message', function message(data, isBinary) {wss.clients.forEach(function each(client) {if (client !== ws && client.readyState === WebSocket.OPEN) {client.send(data, { binary: isBinary });}});});ws.send('欢迎加入聊天室');
});
  • 客户端
let ws = new WebSocket("ws://localhost:8080")
ws.onopen = ()=>{console.log("open")
}
ws.onmessage = (evt)=>{console.log(evt.data)
}

5.2. 授权验证

// 前端
var ws = new WebSocket(`ws://localhost:8080?token=${localStorage.getItem("token")}`)
ws.onopen = () => {ws.send(JSON.stringify({type: WebSocketType.GroupList}))
}
ws.onmessage = (evt) => {console.log(evt.data)
}
// 后端
const WebSocket = require("ws");
const JWT = require('../util/JWT');
WebSocketServer = WebSocket.WebSocketServer
const wss = new WebSocketServer({ port: 8080 });wss.on('connection', function connection(ws, req) {const myURL = new URL(req.url, 'http://127.0.0.1:3000');const payload = JWT.verify(myURL.searchParams.get("token"))if (payload) {ws.user = payloadws.send(createMessage(WebSocketType.GroupChat, ws.user, "欢迎来到聊天室"))sendBroadList() //发送好友列表} else {ws.send(createMessage(WebSocketType.Error, null, "token过期"))}ws.on('message', function message(data, isBinary) {const messageObj = JSON.parse(data)switch (messageObj.type) {case WebSocketType.GroupList:ws.send(createMessage(WebSocketType.GroupList, ws.user, JSON.stringify(Array.from(wss.clients).map(item => item.user))))break;case WebSocketType.GroupChat:wss.clients.forEach(function each(client) {if (client !== ws && client.readyState === WebSocket.OPEN) {client.send(createMessage(WebSocketType.GroupChat, ws.user, messageObj.data));}});break;case WebSocketType.SingleChat:wss.clients.forEach(function each(client) {if (client.user.username === messageObj.to && client.readyState === WebSocket.OPEN) {client.send(createMessage(WebSocketType.SingleChat, ws.user, messageObj.data));}});break;}ws.on("close",function(){// 删除当前用户wss.clients.delete(ws.user)sendBroadList() //发送好用列表})});
});
const WebSocketType = {Error: 0, //错误GroupList: 1,//群列表GroupChat: 2,//群聊SingleChat: 3//私聊
}
function createMessage(type, user, data) {return JSON.stringify({type: type,user: user,data: data});
}function sendBroadList(){wss.clients.forEach(function each(client) {if (client.readyState === WebSocket.OPEN) {client.send(createMessage(WebSocketType.GroupList, client.user, JSON.stringify(Array.from(wss.clients).map(item => item.user))))}});
}

5.3. socket.io模块

  • 服务端
const io = require('socket.io')(server);
io.on('connection', (socket) => {const payload = JWT.verify(socket.handshake.query.token)if (payload) {socket.user = payloadsocket.emit(WebSocketType.GroupChat, createMessage(socket.user, "欢迎来到聊天室"))sendBroadList() // 发送好友列表} else {socket.emit(WebSocketType.Error, createMessage(null, "token过期"))}socket.on(WebSocketType.GroupList, () => {socket.emit(WebSocketType.GroupList, createMessage(null, Array.from(io.sockets.sockets).map(item => item[1].user).filter(item=>item)));})socket.on(WebSocketType.GroupChat, (messageObj) => {socket.broadcast.emit(WebSocketType.GroupChat, createMessage(socket.user, messageObj.data));})socket.on(WebSocketType.SingleChat, (messageObj) => {Array.from(io.sockets.sockets).forEach(function (socket) {if (socket[1].user.username === messageObj.to) {socket[1].emit(WebSocketType.SingleChat, createMessage(socket[1].user, messageObj.data));}})})socket.on('disconnect', reason => {sendBroadList() // 发送好用列表});
});function sendBroadList() {io.sockets.emit(WebSocketType.GroupList, createMessage(null, Array.from(io.sockets.sockets).map(item => item[1].user).filter(item=>item)))
}
// 最后filter,是因为 有可能存在null的值
  • 客户端
const WebSocketType = {Error: 0, //错误GroupList: 1, //群列表GroupChat: 2, //群聊SingleChat: 3 //私聊
}
const socket = io(`ws://localhost:3000?token=${localStorage.getItem("token")}`);
socket.on("connect",()=>{socket.emit(WebSocketType.GroupList)
})
socket.on(WebSocketType.GroupList, (messageObj) => {select.innerHTML = ""select.innerHTML = `<option value="all">all</option>` + messageObj.data.map(item => `<option value="${item.username}">${item.username}</option>`).join("")
})
socket.on(WebSocketType.GroupChat, (msg) => {console.log(msg)
})
socket.on(WebSocketType.SingleChat, (msg) => {console.log(msg)
})
socket.on(WebSocketType.Error, (msg) => {localStorage.removeItem("token")location.href = "/login"
})
send.onclick = () => {if (select.value === "all") {socket.emit(WebSocketType.GroupChat,{data: text.value})} else {socket.emit(WebSocketType.SingleChat,{data: text.value,to:select.value})}
}

http://www.ppmy.cn/devtools/126747.html

相关文章

ES推荐搜索、自动补全,并且springBoot集成

推荐搜索 在搜索过程中&#xff0c;因为单词的拼写错误&#xff0c;没有得到任何的结果&#xff0c;希望ES能够给我们一个推荐搜索。 GET movies/_search {"suggest": {# title_suggestion为我们自定义的名字"title_suggestion": {"text": &qu…

群晖使用Docker搭建NASTool自动化观影工具并实现在线远程管理

文章目录 前言1. 本地搭建Nastool2. nastool基础设置3. 群晖NAS安装内网穿透工具4. 配置公网地址5. 配置固定公网地址 前言 本文主要分享一下如何在群晖NAS中本地部署Nastool&#xff0c;并结合cpolar内网穿透工具&#xff0c;轻松实现公网环境远程管理与访问本地NAS中储存的影…

基于单片机的草坪培育智能控制系统设计

本系统可完成草坪培养培育过程中土壤湿度、光照强度和空气温度的监测与控制。本次设计系统由单片机控制器、土壤湿度传感器、光照强度传感器、温度传感器、A/D转换器、液晶显示器、继电器模块、WIFI模块、报警器、按键等组成。传感器可获取土壤湿度、光照强度和温度信息&#x…

SpringBoot +Vue3前后端分离项目入门基础实例一

项目说明 项项目名称使用框架说明后端项目springboot_vue_element_demoSpringBoot + MyBatis-plus + MySQL完成基本的增删改查操作API前端项目vue-projectVue3 + ElementUI plus + axios界面展示,调用后端API项目文档目录 SpringBoot +Vue3前后端分离项目入门基础实例一 Spri…

面试官:为什么不建议用 equals 判断对象相等?

一直以为这个方法是java8的&#xff0c;今天才知道是是1.7的时候&#xff0c;然后翻了一下源码。 这片文章中会总结一下与a.equals(b)的区别&#xff0c;然后对源码做一个小分析。 一&#xff0c;值是null的情况&#xff1a; 1.a.equals(b), a 是null, 抛出NullPointExcepti…

ChatGPT 现已登陆 Windows 平台

今天&#xff0c;OpenAI 宣布其人工智能聊天机器人平台 ChatGPT 已开始预览专用 Windows 应用程序。OpenAI 表示&#xff0c;该应用目前仅适用于 ChatGPT Plus、Team、Enterprise 和 Edu 用户&#xff0c;是一个早期版本&#xff0c;将在今年晚些时候推出"完整体验"。…

优达学城 Generative AI 课程2:Large Language Models (LLMs) Text Generation

建议先了解一下附录知识。 文章目录 1 官方课程内容自述Lesson 1: 大型语言模型&#xff08;LLMs&#xff09;简介Lesson 2: 自然语言处理&#xff08;NLP&#xff09;基础Lesson 3: Transformer 和注意力机制Lesson 4: 检索增强生成&#xff08;RAG&#xff09;Lesson 5: 为大…

动态规划-简单多状态dp问题——123.买卖股票的最佳时机|||

1.题目解析 题目来源&#xff1a;123.买卖股票的最佳时机|||——力扣 测试用例 2.算法原理 1.状态表示 根据题目可以看出每一天的状态都有"买入""卖出"两种状态&#xff0c;但是还有交易次数限制&#xff0c;因此创建两个二维dp表&#xff0c;f表存储&quo…