Node.js
检查安装成功
node -v回车
如何运行:
1、交互模式:node回车,开始!
2、node 文件的绝对路径
3、vscode-插件:code runner 右键第一个
js和node的区别:
1、JS:ES+BOM+DOM
2、Node:没有BOM和DOM
模块(module)
每一个xx.js都可以称之为模块
每个模块都有一个操作,可以用于公开自己的成员,Node.js自带一个预定义变量:exports,可以直接使用,是一个对象,放在此对象的东西是允许公开的
语法:
①:exports.属性名=值
②module.exports.属性值=值
③module.exports={
属性名:值,
...}
每个模块:都有一个操作可以导入其他模块
Node.js自带一个预定义函数:require,可直接使用,是一个函数,放在此函数里面的路径,就是允许引入的模块文件
语法:
let x=require("./路径")//./不可省略
面试题:exports与module.exports的区别?
①语法、用法、写法不同
②都用于公开自己的成员:但是exports={}的写法是错误的,Node.js的底层:exports=module.exports其实真正做公开功能的是module.exports若是使用了exports={},就相当于是创建了一个空对象,将module.exports给覆盖了
模块的分类
1、官方模块:无需下载
2、第三方模块:npm有很多
3、自定义模块
官方模块:不需要引入,可直接使用
①global不需要引入,可直接使用
五个预定义变量:
1、__filename:获取当前文件的完整绝对路径,无用
***2、__dirname:获取当前文件的完整绝对路径,但不包含文件名
*3、exports对象:空对象,用于公开自己的成员
*4、require:函数,导入其他的模块
**5、module:指当前模块本身,包含以上四个操作
②定时器:周期,一次性,瞬间;瞬间就等效于设置为0的一次性
③console:用法和以前一样
querystring模块
解析查询字符串,使其变成一个对象,可以获取到前端传到后端的消息(请求消息)
引入: let qs=require("querystring")
作用:解析url中部分功能
let obj=qs.parse("查询字符串/请求消息")
获取:obj.键名 若是前端传过来是一个完整的url就无法解析
### url模块
引入:let url=require("url")
作用:解析url的各个部分
let objUrl=url.parse(str,true);默认为false,若为true则为自动解析查询字符串部分
*objUrl.pathname:判断路由的不同,传输不同页面数据
*objUrl.query.键名:查询请求信息
Buffer:缓冲区,Node.js大部分API都支持
fs模块
Filesystem文件系统:let fs=require("fs")
异步读取文件:
fs.readFile(__dirname+"文件路径",(err,buf)=>{
读取到过后要干什么,必须放在回调函数中,不放外面
})
异步写入文件:
fs.writeFile(__dirname+"文件路径","新内容",(err)=>{
干什么放在这里就可以了,会替换掉元凯的东西
})
异步追加文件:
fs.appenFile(与上面一致)//不会替换原来的东西
只有异步才能发挥Node.js的优点(快)
http模块
超级重点!搭建服务器&文件系统,需要导入
let http=require("http");
let url=require("url");
let fs=require("fs");
let app=http.creatServer();//创建一个服务器应用
app.listen(80);//为其绑定端口号,默认端口号可省略
app.on("request",(req,res)=>{
//req-request(请求对象)u哦一个req.url属性,获取前端的请求信息,但是路由与请求信息是一体的,不方便获取某个部分,所以我们引入了url模块进行解析
let objUrl=url.parse(req.url,true);
let router=objUrl.pathname'//获取路由
if(router=="/"){//判断路由
//res有一个方法res.end("响应东西"/buf)响应对象
fs.readFile("路径",(err,buf)=>{
res.end(buf)
})
}
else if(router=="./news.html"){
fs.readFile("路径",(err,buf)=>{
res.end(buf)
})
}
})
扩展:字符串还有一个API:match,与indexOf相似,但是支持正则,不关心结果是什么,但是没有就是null,用它可以做判断
let rs=str.match(reg)
强调:一切的herf,src,action都是一个请求和路由
模块的分类
1、官方模块:require("官方模块")
2、第三方模块:npm有很多
3、自定义模块:require("./模块路径")
自定义模块
分为两大类:
1、文件模块:创建xx.js去公开了需要公开的内容,主模块引入,就必须写为require("./模块路径")
2、目录模块:3种
①创建m1的文件夹,在其中创建了index.js文件公开了需要公开的内容,主模块引入,就必须写为require("./m1")
②创建m2的文件夹,在其中创建了xx.js文件公开了需要公开的内容,在m2中创建了package.json的配置文件写入{"main":"xx.js"},主模块引入,就必须写为require("./m2")
③创建了一个文件名必须为node_modules,在其中创建了m3文件夹,之后创建了index.js公开,主模块引入必须写为require("m3")
第三方模块
npm工具:专门用于管理第三方模块,作用:下载,更新,删除,维护包之间的关系
(在项目中打开cmd)
下载:npm i 包名
更新:npm up 包名
删除:npm un 包名
mango
是基于json的数据库
1、启动:
在bin文件夹打开cmd,输入:.\mogod.exe --dbpath=文件路径
(不可关闭mango服务器的cmd)
2、语法:
查询所有的数据库:show dbs
创建/切换数据库,没有就是创建:use 数据库名
查看当前选中的数据库:db
创建数据表:db.creatCollection("表名")
删除数据库:db.dropDatabase()不推荐,要坐牢
数据表的操作:
创建数据表:db.createCollection("表名")
查看目前所有数据表:db.getCollectionNames()
删除数据表:db.表名.drop()不推荐
数据的操作:
增:db.表名.save({键值对},{})
删:db.表名.remove({条件})//条件也是键值对
改:db.表名.update({条件},{$set:{新内容}})
*查:db.表名.find()找所有
db.表名.find({条件})找到符合条件的人
db.表名.find({},{name:1,_id=0})//找所有人,但是只要name,1表示要,0表示不要
db.表名.find({}).sort({age:1})按age升序排列,1代表升序,-1代表降序
db.表名.find({age:{$gt18}})拿到age大于18的数据,gt大于,lt小于,gte大于等于,lte小于等于
db.表名.find({name:/吴/})正则,模糊查询
db.表名.find({}).skip(i).limit(j)找所有,跳过i条再拿j条
db.表名.find({}).count()获取有多少条数据,可用来做分页器
Node.js操作mongoDB
使用:
1、引入:let mongoose=rquire("mongoose")
2、链接数据库:mongoose.connect("mongodb://127.0.0.1/数据库名")
3、创建一个数据表的同时设置类型的控制,防止用户乱输:
let UserSchema=mongoose.Schema({
name:String,
pwd:String,
age:Number,
email:String,
vip:String
})
let User=mongoose.model("User",UserSchema,"表名")//选择数据表
4、增:创建要插入的对象:
let x=new User({
name:值,
pwd:值,
age:值,
email:值,
vip:值
})
存储到数据库中:
x.save().then(()=>{
//增加之后的操作放这里
})
5、删:
User.deleteOne/deleteMany({条件}).then(()=>{
//删除之后的操作放这里
})
6、改:
User.updateOne/updateMany({条件},{新内容}).then(()=>{
//更新之后的操作放这里
})
7、查:
User.find({条件}).then((rs)=>{
rs->查询到的json数据
})
tips:form表单有一个action,后端可以objUrl.query得到
AJAX
1、概念:
同步交互:用户向服务器发起请求,直到服务器端响应的全过程,用户是不可以进行操作的
异步交互:用户向服务器发起请求,直到服务器端响应的全过程,用户是可以进行操作的
异步代码/技术: 1、定时器
2、Node中的数据库的增删改查
3、Ajax:在不刷新页面的情况下和服务器端进行交互
如何使用:
1、创建AJAX的核心对象
let xhr=new XMLHttpRequest();
2、前端建立和服务器端的链接
xhr.open("GET/POST","/路由")
3、向服务器端发送请求
xhr.send("key=value&...")
特殊:
①GET的send方法会失效,但不能省略,必须写为null
xhr.open("GET","/路由?key=value")
xhr.send(null)
②POST的send方法可用,但是必须写为:
xhr.open("POST","路由")
xhr.setRequestHeader("content-type",application/x-www-form-urlencoded)
4、绑定监听事件
xhr.onreadystatechange=()=>{
if(xhr.readyState==4&&xhr.status==200){//链接无问题
xhr.responseText//后端响应的数据
}
}