BOM:Browser Object Model - 浏览器对象模型,专门操作浏览器,没有标准,不像DOM有ECMA协会规范标准,所有某的浏览器操作可能和别人不一样(老IE),BOM使用的相对较少,当然也有重点(定时器、event对象)
1、window:扮演着两个角色:
1、代替了global,成为了全局对象,保存着全局变量和全局函数
2、指代当前窗口本身 - 展开一些操作:
1、浏览器打开新链接的各种方式:
1、在当前页面打开,可以后退
HTML:<a href="url">文字</a>
JS:open("url","_self");
2、在当前页面打开,禁止后退 - 使用场景:比如电商项目:结账后,禁止后退
HTML:做不到
history对象:BOM对象,当前窗口的历史记录url对象,记录着当前窗口的历史(打开【过】的url)
location对象:BOM对象,当前窗口的正在打开的url对象,而它提供了一个叫替换的方法,是不会产生历史记录的,但是url替换必然也会导致页面发生改变,有此特性可以搞定此操作
JS:location.replace("新url");
3、在新窗口打开,可以打开多个
HTML:<a href="url" target="_blank">文字</a>
JS:open("url","_blank");
4、在新窗口打开,只能打开一个 - 使用场景:比如电商项目:只允许打开一个结账页面
HTML:<a href="url" target="自定义name">文字</a>
JS:open("url","自定义name");
自定义name:随便的写一个东西,每个窗口的底层都会有一个名字,打开时,
如果没有此名字的窗口则为打开,如果有此名字的窗口则为替换(刷新)
学完此操作:收获:
1、跳转不是必须a标签
2、用不用看你自己,用好了能够提升用户的体验感
3、a标签其实还有些其他功能:
下载:<a href="xx.exe/rar/zip">下载</a>
打开:<a href="xx.txt/图片格式">打开</a>
直接书写js:<a href="javascript:js语句;">不用绑事件</a>
2、window的方法和属性:
1、属性:获取屏幕/浏览器的大小:
1、获取浏览器的完整大小:outerWidth/outerHeight
2、*获取浏览器的文档显示区域的大小:innerWidth/innerHeight
3、获取屏幕的大小:screen.width/height - 一般来说没用,我们暂时不是做桌面应用的
2、方法:
1、打开窗口:var 新窗口=open("url","target/自定义","width=,height=,top=,left=");
特殊:1、第三个参数,如果不加,那么新窗口会和浏览器融为一体,但是如果加了第三个参数,小窗口会脱离浏览器
2、宽高尽量不要设置的太小了,浏览器具有最小宽高,不能超过
3、保存住你打开的新窗口,甚至以后可以绑定事件
2、关闭窗口:window/新窗口.close(); - 垃圾
3、移动窗口的位置:新窗口.moveTo(newX,newY); - 注意此方法只有新窗口可以使用
4、改变窗口的大小:新窗口.resizeTo(new宽,new高); - 注意此方法只有新窗口可以使用
5、定时器:根据你提供的时间间隔,执行操作
1、周期性:反复执行的
开启:timer=setInterval(callback,间隔毫秒数);
停止:clearInterval(timer);
2、一次性:只会执行一次
开启:timer=setTimeout(callback,间隔毫秒数);
停止:clearTimeout(timer);
其实用哪个都无所谓,因为他们底层一样,而且两者也可以相互转换
面试题:循环、函数、定时器都可以反复执行,那他们的区别在哪里?时机不同
1、循环 - 几乎是一瞬间就完成了 2、函数 - 调用几次执行几次 3、定时器 - 等待设置的时间
1、BOM的其他的对象:history、navigator、location、event,BOM的对象都由浏览器的js解释器自动创建
2、history:保存当前窗口的历史记录(打开【过】的url),可用于:
前进:history.go(1); 后退:history.go(-1); 刷新:history.go(0); 浏览器现在自带此功能
3、navigator:保存着当前浏览器的基本信息(浏览器的名称和版本号)
如何判断:navigator.userAgent; - 得到一个字符串,上面放着我们需要的部分,但是每个浏览器的字符串都不一样,需要获取关键字,但是要考虑怎么截取更舒服
明明可以单独为老IE做操作,为什么会说他没什么用? 1、前辈们往往为我们提供了老IE兼容的方法 2、现在的趋势是移动端,所以PC的开发慢慢的变得少了 3、移动端不存在老IE,只有安卓(谷歌)和 苹果(safari)
4、***location:保存着当前窗口【正在打开】的url
***常识:一个url网址由哪些部分组成?
https://www.baidu.com/s?wd=%E5%95%A6%E5%95%A6%E5%95%A6&rsv_spt=1&rsv_iqid=0xc1ed57da00129754&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=44004473_20_oem_dg&rsv_enter=1&rsv_dl=tb&rsv_sug3=6&rsv_sug1=3&rsv_sug7=100&rsv_sug2=0&rsv_btype=i&inputT=2176&rsv_sug4=2176
http://127.0.0.1:8020/bom02/new/01-1.html?__hbt=1675130294579
一共5部分
协议:https(加密 - 安全性更好)、http(未加密)、ftp、ws(直播、在线聊天、在线股票)
主机号/域名:其实是同一个东西,只不过域名需要花钱购买,而且域名更好更方便记忆,本地自己访问自己,主机号默认为127.0.0.1
端口号:https默认端口号为443,http默认端口为80,只有使用默认端口,才可以省略不写
文件的相对路径:只不过百度加密了,不让我们看到
路由/查询字符串/请求消息:多半都是get表单提交带来的或者是ajax提交带来,是前端发送到后端的消息,后端可以根据我们发送的消息进行解析,并且返回给我们需要的内容
协议://域名:端口号/文件相对路径?路由
注意:vscode - xxxx default打开网页是本地打开方式,看不到服务器网站,你可以下载一个插件live server,右键用此方式打开就可以用到vscode自带的内置服务器
*属性:可以获取到url的任何一部分
协议:location.protocol;
域名:location.hostname;
端口号:location.port;
文件路径:location.pathname;
路由:location.search
哪怕不记得,没关系,一定要学会输出location对象可以直接看到所有属性
*方法:
跳转:location="新url"
跳转后,禁止后退:location.replace("新url");
5、*****event:事件对象
事件:用户触发的 或 浏览器自动触发
1、绑定事件:3种
1、在HTML页面上绑定事件:
<elem on事件名="js语句"></elem>
全是缺点:
1、不符合内容(HTML)与样式(CSS)与行为(JS)的分离原则
2、无法动态绑定事件(一次只能绑定一个元素)
3、无法同时绑定多个函数对象
2、*在js中使用元素的事件处理函数属性
elem.on事件名=function(){js语句}
优点:
1、符合内容(HTML)与样式(CSS)与行为(JS)的分离原则
2、动态绑定事件
3、不存在兼容性问题
缺点:
1、无法同时绑定多个函数对象
3、使用专门的事件API绑定事件
优点:
1、符合内容(HTML)与样式(CSS)与行为(JS)的分离原则
2、动态绑定事件
3、同时绑定多个函数对象
缺点:
存在兼容性问题 - 而且写起来很麻烦
主流:elem.addEventListener("事件名",callback);
老IE:elem.attachEvent("on事件名",callback);
兼容:
if(elem.addEventListener){//判断有没有此方法
elem.addEventListener("事件名",callback);
}else{//没有此方法,一定是老IE
elem.attachEvent("on事件名",callback);
}
2、事件周期:从事件发生,到所有事件函数处理完毕的全过程
3个阶段:
1、捕获阶段:由外向内,记录着要发生的事件有哪些
2、目标优先触发:目标元素->真正触发事件的是元素,和当前元素this有一些区别
3、冒泡触发:由内向外,触发记录着的所有事件
3、获取事件对象event:
主流:会自动作为事件处理函数的第一个形参传入
elem.on事件名=e=>{}
老IE:event
兼容:var e=event;//不光老IE可用,主流也可以使用 - 小三上位
*****获取到事件对象,我们可以干什么?
1、获取鼠标的位置/坐标
2、阻止冒泡 - 其实冒泡非常棒!我们几乎不会主动去阻止冒泡,阻止冒泡一般都出现在笔试面试之中
主流:e.stopPropagation();
老IE:e.cancelBubble=true;
兼容:e.cancelBubble=true;//不光老IE可用,主流也可以使用 - 小三上位
3、*利用冒泡/事件委托:
优化:如果多个子元素定义了相同 或 相似的操作,最好只给父元素定义一次
为什么:每一次绑定一个事件函数,其实就是创建了一个事件对象,创建的事件对象越多,网站的性能越低下
淘汰了this:水性杨花,当前元素
认识一个目标元素target:你点击的哪一个,他永远就是哪一个,不会变化
主流:e.target;
老IE:e.srcElement;
兼容:e.srcElement;//不光老IE可用,主流也可以使用 - 小三上位
4、阻止浏览器的默认行为:a标签默认会跳转,右键自带一个弹出框,F12打开控制台,F5会刷新,提交按钮会提交
主流:e.preventDefault();
老IE:e.returnValue=false;
兼容:
if(e.preventDefault){
e.preventDefault();
}else{
e.returnValue=false;
}
扩展:2个事件
1、鼠标右键:oncontextmenu
2、键盘按下:onkeydown
5、获取键盘的键码
e.keyCode; - 不要记忆,要么输出看看你当前点击的那个按钮是什么码,要么去百度找keyCode表
扩展:客户端存储技术:
1、cookie:淘汰了,使用很麻烦 - 最大只能传2kb
2、请求消息部分/查询字符串部分/路由 - 也可以存储,但是不适合多页面传输
3、***webStorage:HTML5(综合性概念)提出来的一个新特性:2种
1、sessionStorage - 会话级,只要浏览器一旦关闭,数据就会死亡
2、localStorage - 本地级,永久存在的
1、添加:xxxxStorage.属性名=值;
2、获取:xxxxStorage.属性名;
3、删除:xxxxStorage.removeItem("属性名"); - 只会删除一个
4、清空:xxxxStorage.clear(); - 删除全部
1、Nodejs学习原因:
1、前端招聘要求 - 熟悉 或 了解一门服务器端技术者优先
2、对于我们前端来说,了解服务器端的机制,更好更快的进行前端开发
扩展:
全栈工程师 - 客户端(PC+移动端+小程序)+ 服务器端(Node.js) + 数据库(mongoDB)
技术类发展:
全栈 - 涉及到多个领域,每个领域都会用,但是不必精通 -> 架构师 -> 项目经理 -> 技术总监
专家 - 某个领域顶尖的,甚至可以自己创建
销售类发展:
产品 -> 产品经理 -> 产品总监
教育类:
创业类:不太推荐
可能成为全栈的语言:
1、Java语言 - 不包含移动端(安卓)
2、JavaScript语言
客户端 - 开发根本
服务器端 - Node.js 历史上第一次一门语言可以通吃前后端
数据库 - mongoDB
移动端 - 网页/app/小程序/公众号(跨所有平台IOS+Andriod)
混合开发框架:uniapp/h5+plus/jqueryMobile - 只需要一个前端,学习一点点ios和andriod的语法就可以搞定
server+ajax:6天
对服务器端的掌握 - 入门
最终目的:登录 + 注册 + 全站一条龙:增删改查
小项目:图书/金夫人/咖啡管理系统
2、基本内容
服务器端概念:
简单来说就是一个电脑
生活中:微型机
商业/国家:小型机(造价大概几十万,好的上百万)、中型机、大型机、超级计算机
拥有服务器的方式:
1、买 - 对中小型公司遭不住
2、买一台配置好一点的微机 - 别的行业的公司还是不错
3、租云服务器端 - 腾讯云/阿里云/百度云/新浪云... - 配置自选的,价格越高,性能越好
对于开发人员来说
硬件服务器 - 电脑
软件服务器 - 中间件(软件可以将你的电脑变成一台服务器,其他人都可以过来访问)
软件架构:服务器很重要
C/S - client(客户端)/server(服务器端)
举例:QQ
大型网络游戏
优点:用户的体验感较好、运行稳定、对带宽2mb的要求低
缺点:1、占硬盘空间 2、更新过于麻烦 - 服务器端和客户端都要更新
B/S - browser(浏览器端)/server(服务器端)
举例:网页版QQ
网页游戏
优点:1、几乎不占硬盘,更新简单 - 只需要更新服务器端
2、电脑再差也无所谓
缺点:1、体验感相对较差(越来越好)- 云游戏
2、对带宽的要求高
3、Node.js概述:
不是JS,但是语法和JavaScript非常相似,他的竞争对手JAVA、C#、Python、PHP等等,历史上第一次一门语言可以通吃前后端
做的功能绝对不是特效,做的事是服务器端的操作(形成了一个前端和数据库沟通的桥梁 - 数据交互)
目的:
1、使用代码搭建一个服务器&文件系统(放在代老师电脑上的HTML,你们也可以通过网址来进行访问)
2、Node.js如何和数据库进行沟通交流(在这之前我们还需要学习mongoDB)
3、全栈一条龙开发:图书管理系统(HTML+CSS+JS+NODE.JS+MONGODB)
4、Node.js安装:
node-v16.17.0-x64.msi - 一路往下点,哪里点不动了,就把哪里勾上,千万不要取消任何东西
版本:16年初(0.12) 16年中(4.xx) 16年底(6.xx) - 更新速度快,意味着:发展迅速,但是也没加什么新东西
检查自己安装成功没有:打开cmd,输入node -v,如果你能看得到版本号,说明你的node.js安装成功了
其实我们安装的这个node.js就是一个运行环境而已,不再需要浏览器自带的js解释器,node.js的语法和javascript非常相似
5、Node.js如何运行
1、交互模式 - 临时测试
打开cmd,输入node回车,就可以开始瞧你的“js”代码了
退出:ctrl+c
2、脚本/文件模式 - 正式开发中,丑了点
1、创建xx.js,里面书写自己的代码
2、打开cmd,输入:node 文件的绝对路径 然后回车
3、现在我们的开发工具非常强大,有插件可以直接在开发工具中运行,前提是以上两个操作你能用的情况
vscode:安装一个插件:code runner,代码处可以右键,第一个选项就是run
6、node.js的知识点:
1、js和node的区别:
相同点:都可以使用一切的ECMAScript提供的东西,放心大胆用,服务器端根本不存在浏览器,所以不必担心兼容问题
不同点:1、javascript:ES+DOM+BOM - 做一切的特效
2、Node.js:虽然不支持DOM和BOM(不是做特效的,是做数据交互的),但是他却提供了成千上万个新的模块等待我们学习
2、模块:每个.js文件都可以称之为是一个模块
1、模块化开发方式:如果以一个电商网站来说,我们可以按功能分为很多模块:商家模块、商品模块、产品模块、促销模块....
分工合作:将每个模块交给对应的人完成,最后再由【主模块】进行引入
1、每一个模块都i有一个操作,可与公开/暴露自己的成员:
exports.属性名=属性值;
module.exports={
属性名:属性值,
...
}
两种方式都可以公开
2、每一个模块都有一个操作,可以引入其他的模块
var xxx=require("./文件名")
鄙视体:exports和module.exports的区别?
都是用于公开暴露自己的成员的
但是:exports={},写法是错误的,为什么?
node.js底层有一句话:exports=module.exports
其实真正做公开功能的是module.exports
如果你使用 exports={},覆盖了module.exports,不在具有公开的功能了
3、模块的分类:
1、官方模块 - 今/明天学习的重点,大概20几个,重要的就只有几个
2、第三方模块 - 多到数不清,提供了很多官方没有提供过的东西,在npm上放着,需要自行下载(mongoose)
3、自定义模块
Node.js最大的特点:
1、非常快 - 以前最快的是php,Node.js的速度是php的16倍
2、为什么这么快?
1、因为官方模块提供的东西少,甚至连数据库操作都没有
2、使用google浏览器的v8引擎
4、官方模块:不需要下载,在你安装node环境的时候就已经装好,但是某的模块需要引入(官方模块引入不需要加./),某的模块不需要引入,跟我一起学习
1、Global模块:全局模块 - 提供了一些全局变量,是不需要引入的,可以直接使用
一共提供了5个预定义变量:
__filename:当前文件的完整的绝对路径
*__dirname:当前文件的绝对路径,但是不包含文件名称,对你们某些使用vscode的同学有用
*exports:一个空对象,公开和暴露自己的成员
*require:一个函数,引入其他模块的
*module:指代当前模块本身,包含了其他4个变量
控制台对象console - 现在的console不再是当初的console,只不过用法和当初还是一样的
定时器对象:周期性和一次性和瞬间定时器 - 现在定时器不再是当初的定时器,只不过用法和当初还是一样的
2、QueryString模块:查询字符串
需要引入:var qs = require('querystring');
提供了解析url的查询字符串部分的功能
var obj=qs.parse("查询字符串");
想要获取到前端传来的某一部分:obj.键名;
垃圾:只能解析查询字符串部分,如果前端传来的是一个完整的url网址,那么它就解析不了了
3、***url模块:解析完整的url - 今日小重点
需要引入:var url = require('url');
提供了解析完整的url的方法:
var objUrl=url.parse("完整的url",true);//如果传入了第二个实参true,则会悄悄的调用querystring模块的parse方法,把查询字符串也解析为一个对象
真正的重点:2个
1、查询字符串:objUrl.query.键名 - 拿到前端传到后端的东西
2、路由:objUrl.pathname - 判断路由的不同,响应给用户不同的页面看
4、Buffer模板:缓冲区,可以将数据变为一个16禁止的数字,可以理解为是Node.js中新提供的一个数据结构
我们绝对不要手动使用此操作,但是Node.js中的某些API会让我们自动得到一个buf,但是不用担心
Node.js大部分的API都是支持buf的
5、*****fs模块:filesystem - 文件系统 - 今日大重点
需要引入:const fs = require('fs');
提供了可以操作文件的API
异步读取:fs.readFile("文件的路径",(err,buf)=>{
buf-读取到的内容
})
异步写入:fs.writeFile("文件的路径","新内容",()=>{
//写入完毕后要干什么操作就放在这里
})
异步追加:fs.appendFile("文件的路径","新内容",()=>{
//写入完毕后要干什么操作就放在这里
})
异步才能最大的发挥node.js的特点:快!
1、官方模块
6、http模块 - 超级重点:搭建http服务器的
1、引入
var http=require("http");
var url=require("url");
var fs=require("fs");
2、根据提供的API创建服务器应用
var app=http.createServer();
3、为其设置监听的端口号
app.listen(80);
4、设置监听请求事件,http模式:请求-响应模式,一定要有请求,才会有响应,前端发的叫请求,后端回答的才叫响应
app.on("request",(req,res)=>{
//req:request,请求,前端发的才叫请求,而,这个req对象,会有一个属性叫做req.url,就可以得到前端传来的路由&请求消息,我们希望把路由和请求消息区分开,所以需要搭配另一个url模块
var objUrl=url.parse(req.url,true);
var router=objUrl.pathname;
if(router=="/" || router=="/index.html"){
//应根据判断路由的不同,响应不同的页面,给用户看,需要用到另一个模块fs
fs.readFile("./public/html/index.html",(err,buf)=>{
//res:response,响应,后端回答的才叫响应,而,这个res对象,会有一个方法叫做req.end(str/buf);可以进行响应
res.end(buf)
})
}else if(router.match(/html/)!=null){
fs.readFile("./public/html"+router,(err,buf)=>{
//res:response,响应,后端回答的才叫响应,而,这个res对象,会有一个方法叫做req.end(str/buf);可以进行响应
res.end(buf)
})
}else if(router.match(/css|js|png|gif|jpg|woff|woff2|webp|jpeg/)!=null){
fs.readFile("./public"+router,(err,buf)=>{
//res:response,响应,后端回答的才叫响应,而,这个res对象,会有一个方法叫做req.end(str/buf);可以进行响应
res.end(buf)
})
}
})
把一切的src、href、引入的东西,都会当作是一个请求
2、自定义模块:自己的书写的js:var xx=require("./模块名");
分为2大种操作方式:
1、文件模块:创建xx.js去公开自己想要公开的内容,主模块引入时必须:var xx=require("./模块名");
2、目录模块:3种
1、比如创建m1文件夹,在其中创建index.js的文件,再在里面去公开自己想要公开的内容,主模块引入时必须:var xx=require("./m1");
2、比如创建m2文件夹,在其中创建xx.js的文件,再在里面去公开自己想要公开的内容,主模块引入时必须:var xx=require("./m2");
必须再创建一个名为package.json的配置文件,里面书写一句话:{"main":"xx.js"}
3、创建一个文件夹必须名为node_modules,在其中创建m3文件夹,在其中创建index.js的文件,再在里面去公开自己想要公开的内容,主模块引入时必须:var xx=require("m3");
其实真实开发中,我们程序员用的最多的就是文件模块,目录模块的第三种方式其实根本不是给人用的(机器用的:第三方npm包管理器,下载的东西会自动创建出此文件夹)
3、如何去使用第三方模块:npm:Node Package Manager:Node的模块/包/软件管理器,其实在你安装node.js环境时已经安装好了
检查你安装好npm没得:打开cmd,输入npm -v,如果能看到版本号说明已经安装成功了
专门管理第三方模块:作用:
1、*下载:npm i 包名;
2、卸载:npm un 包名;
3、更新:npm up 包名;
维护着包之间的依赖关系
记得打开cmd,要在自己的项目路径打开
可以打开npm官网,查看你需要下载包,知道包名后,就可以做上面的三个操作了
mongoDB:数据库产品有很多(Oracle、MySQL),Mongo只是其中之一,搭配Node.js更合适,存储着很多很多跟我们项目挂钩的数据
1、安装&启动mongoose:
1、解压代老师发给你mongodb-win32-x86_64-2008plus-ssl-3.6.11.zip
2、我们得到的文件夹进入bin文件夹里面有:mongo.exe(客户端) 和 mongod.exe(服务器端)
3、如何启动:
当前文件夹处,打开cmd:输入:.\mongod.exe --dbname=你想要保存的绝对路径地址 回车 - mongo服务器启动成功
不要关闭此命令行cmd
再打开一个cmd:输入:.\mongo.exe - 开启mongo客户端,再看看上一个命令行是否连接成功
2、mongo语法:
1、数据库操作:
1、查询数据库:show dbs
2、*创建/切换数据库:use 数据库名称;//居然查看不到,一定要在创建数据表后,我们才能看到自己创建的Mongo数据库
3、查看当前选中的数据库:db;
4、*创建数据表:db.createCollection("表名");
5、删除数据库:db.dropDatabase();
2、数据表操作:
1、*创建数据表:db.createCollection("表名",{size: 5242880,capped:true,max:5000});//最大空间为5mb,最多存储5000个,意味着你加了第二个实参,会导致限制用户操作,不推荐
2、*查看目前所有的数据表:db.getCollectionNames();
3、删除数据表:db.表名.drop()
3、*****数据操作:
1、增:db.表名.save({键值对,...}) - 一次只能插入一条数据
db.表名.save({},{},{},{},...) - 一次插入多条数据(不推荐:注册本来就是一次创建一个账号)
2、删:db.表名.remove({}) - 会删除所有数据的
db.表名.remove({pwd:"666666"}) - 会根据我们传入的条件,删除密码为666666的这个数据(注销账号)
3、改:db.表名.update({name:"袍哥"},{$set:{pwd:"999999"}})
找到名字叫袍哥,修改pwd为999999
4、*查: db.表名.find({}) - 所有
db.表名.find({age:25}) - 找到所有年龄为25岁的
db.表名.find({age:{$gte:18}}) - 找到所有年龄大于等于18的
db.表名.find({pwd:/6/}) - 甚至可以写正则模糊查询
db.表名.find({},{name:1,pwd:1}) - 只需要获取到所有人的名字和密码
db.表名.find().sort({age:1}) - 根据age进行升序排列,如果age:-1,则为降序排列
db.表名.find().skip(5).limit(5) - 跳过前5条,再拿5条,可以理解为6-10
db.表名.find().count(); - 获取到此表有多少条数据
3、安装mongodb-compass-1.33.1-win32-x64:此为mongo数据库的图形化界面,比cmd好看多了,最大的作用就是为了方便我们看!
4、Node.js操作mongoDB
1、使用npm安装mongoose第三方模块
2、使用步骤:
1、引入:var mongoose = require('mongoose');
2、连接数据库:mongoose.connect("mongodb://127.0.0.1/数据库名称");
3、创建出一个新的数据表的同时,设置数据类型的控制,防止用户乱输:
var userSchema=mongoose.Schema({
name: String,
age: Number,
pwd: String,
email: String,
vip: String
})
// 自定义 选中了你想要操作的某个数据表
var User=mongoose.model("User",userSchema,"数据表名")
4、增:
var x=new User({
name: "李红慧",//
age: 18,
pwd: "123456",
email: "lhh@qq.com",
vip: 1
})
x.save((err)=>{
console.log("新增完毕要做什么,就在这里做")
})
5、删:
User.remove/【deleteOne】/deleteMany({条件},(err)=>{
console.log("删除完毕要做什么,就在这里做")
})
6、改:
User.update/【updateOne】/updateMany({条件},{新内容},(err)=>{
console.log("修改完毕要做什么,就在这里做")
})
7、查:
User.find({条件},(err,result)=>{
result;//返回的结果,是我们的最爱JSON格式
})