node + mongoose
安装
npm init -y
npm install mongoose -S
config/index.js
//引入mongoose模块
const mongoose = require('mongoose');
//创建连接 test数据库的名称
mongoose.connect('mongodb://localhost:27017/test',{
useNewUrlParser: true,
useUnifiedTopology: true
})
module.exports = mongoose
model/testModel.js
const mongoose = require("../config")
//给集合约束
const Schema = mongoose.Schema
//设置Schema约束字段,指明了集合中的字段
const mySchema = new Schema({
username:String,
age:Number
})
//创建集合 test > person ({username,age})
//注意:设置集合的时候需要改成复数的形式!否则数据库中集合名字就会变成复数了
module.exports = mongoose.model('users',mySchema)
index.js
//引入testModel
const testModel = require("./model/testModel")
//往person集合中插入数据
// testModel.insertMany([{username:"张三",age:18}],(err)=>{
// if(!err){
// console.log("插入成功!")
// }
// })
//修改数据
// testModel.updateOne({username:"张三"},{$set:{username:"李四"}},(err)=>{
// if(!err){
// console.log("修改单条数据成功...")
// }
// })
//查询数据
//会将查询到的所有的结果返回到一个数组里面
// testModel.find({username:'李四'},{username:1,_id:0},(err,result)=>{
// if(!err){
// console.log("result===>",result)
// }
// })
//删除数据
// testModel.deleteOne({username:'李四'},(err)=>{
// if(!err){
// console.log("删除成功...")
// }
// })
Socket编程
之前的所有的请求后端接口都是采用ajax方式
问题:
例如有一个奥运赛事直播,需要金牌数量实时的显示出来。
需要通过setInterval定时器,没过1s钟需要实时的向后端发起请求,后端在把金牌的数量给前端返回。(前端轮询的方式 半双工通信流程)
这种操作会大大的损耗性能,影响浏览器的效果。
我们可以通过Socket编程去实现全双工通信。主要基于服务端推送技术实现。
还可以在实时的在线聊天。
node.js里面可以依靠原生模块net实现socket编程。 在H5的浏览器里面可以借助websocket实现实时通信。
html5中可以借助ws模块实现websocket实时通讯编程。
yarn add ws
Server.js
const WebSocket = require("ws").Server;
const ws = new WebSocket({
port:9000
})
let clientMap = {}
let i = 0
//监听客户端连接
ws.on("connection",client=>{
client.name = ++i
clientMap[client.name] = client
//接受客户端发送来的消息,然后进行广播,服务端推送消息给所有的客户端对象
client.on("message",data=>{
broadCast(client,data)
})
client.on("error",()=>{
console.log(client.name+"下线了...")
})
})
//可以让服务端做一个广播的效果,将具体client发送的message传送给所有的客户端对象
function broadCast(client,data){
for(let key in clientMap){
clientMap[key].send(client.name+"说的:"+data)
}
}
Client.js
//创建客户端实例
const ws = new WebSocket("ws://localhost:9000")
//客户端向服务端发送消息
ws.onopen = ()=>{
ws.send("大家好!")
}
//客户端接受服务端发送消息
ws.onmessage = data =>{
document.querySelector("#content").innerHTML += data.data+"<br/>"
}
//客户端可以监听服务端关闭,触发此方法
ws.onclose = ()=>{
console.log("服务器关闭了...")
}
index.html
<!--引入客户端文件-->
<script src="./Client.js"></script>
开启服务nodemon Servr.js 然后打开index.html页面,控制台输入ws,发现有这个东西。
<body>
<h1>websokect实现在线聊天室</h1>
<div id="content" style="width:400px;height:400px;border:1px solid #ccc"></div>
<input type="text" id="msg" style="width:200px">
<button id="submit">提交</button>
<script>
//点击提交,获取输入框的值,然后通过ws将其发送给服务端,然后服务端进行推送广播给客户端
document.querySelector("#submit").addEventListener("click",()=>{
let myValue = document.querySelector("#msg").value;
//需要将myValue发送给服务端
ws.send(myValue)
})
</script>
</body>