Node.js
js和Node的区别:
相同点:都可以使用一切的ECMAScript的东西,包括一切的API,在服务器端不存在任何浏览器,不必担心任何兼容性问题。
不同点:
JS:ES+BOM+DOM
Node.js:没有BOM和DOM,但有很多模块
模块(mudule):每一个xx.js,都可以称为是一个模块
模块化开发:一个网站来说,一个网站来说,按功能分为很多模块
分工合作:将每一个模块交给对应的人来完成,最后再由主模块进行导入
每一个模块都有一个操作,可以用于公开暴露自己的成员
Node.js自带一个预定义变量:exports,可以直接使用,是一个对象,放在此对象里的东西,是允许公开的东西
语法:
exports.属性名=属性值
module.exports.属性名=值
module.exports={
属性名:值,
...
}
每一个模块(主模块)都有一个操作,可以用于导入/引入其他模块
node.js自带一个预定义函数:require 可以直接使用,是一个函数,放在此函数内的路径,就是允许导入的模块文件
语法:
var x=require("./路径")// ./千万不能省略
模块的分类:
官方模块: node.js自带、
Global模块:不需要引入,可以直接使用
1.__filename:获取当前文件的完整路径 - 无用
2.__dirname: 获取当前文件的完整路径
3.exports - 空对象:用于公开暴露自己的成员
4.require - 函数:用于引入其他模块
5.module - 指当前模块本身,包含上面几个操作
定时器:同JS定时器一样
console;同JSconsole一样
querystring模块:解析查询字符串,使其变成一个对象,可以获取到前端传入后端的消息(请求消息),需要引入: var qs=require("querystring")
作用:解析url中查询字符串部分功能
var obj=qs.parse("查询字符串/请求消息")
缺点:如果前端传来的是一个完整的url路径,它就解析不了了
url模块:
需要引入:var url=require("url")
作用:解析url中各个部分的功能
var objUrl=url.parse(str,true)//第二个参数是一个布尔值,默认是false;设为true,就会自动使用querystring的parse方法去解析查询字符串部分
路由/文件相对路径/请求地址:objUrl.pathname//判断路由不同,去读取不同的HTML发给用户
查询字符串/请求消息:objUrl.query.键名//前端form(get)传送到后端的东西
Buffer模块:缓冲区 可以将数据变成一个16进制的数字,是node.js中的一种新的数据类型
不需要引入,可以直接使用,node.js中大部分的API,都支持buffer
fs模块:Filesystem - 可以用代码操作文件
需要引入:var fs=require("fs")
异步读取文件:
fs.readFile(__dirname+"文件路径",(err,buf)=>{
console.log(buf)//读取到的东西,读取过后的操作,必须放回此函数里面
异步写入文件:
fs.readFile(__dirname+"文件路径","新内容"(err)=>{
console.log(buf)//写入的东西,写入完毕后的操作,必须放回此函数
})//会替换掉原来的东西
异步追加文件:
fs.readFile(__dirname+"文件路径","新内容"(err)=>{
console.log(buf)//写入的东西,写入完毕后的操作,必须放回此函数
})//不会替换掉原理来的东西
http模块:搭建服务器和文件系统
需要引入:
var http=require("http");
var url=require("url");
var fs=require("fs");
var app=http.createServer();//创建一个服务器应用
app.listen(80);//绑定一个端口号
app.on("request",(req,res)=>{
//req - request(请求)对象,它有一个属性req.url,获取大前端传到后端的路由和请求消息,但是路由和请求消息融为一体的,可以引入url模块,进行解析
var objUrl=url.parse(req.url,true);
var router==objUrl.pathname;//单独获取路由
if(router=="/"){//判断路由
//res - response(响应)对象,它有一个方法res.end("响应东西/buf")
fs.readFile("./publice/html/index.html", (err,buf)=>{
res.end(buf)
})
}else if(router=="./news.html"){
fs.readFile("./publice/html/news.html", (err,buf)=>{
res.end(buf)
})
}else if(router.match(/html|js|png|jpg|.../!=null)){
fs.readFile(`./public${router}`,(err,buf)=>{
res.end(buf)
})
}
})//绑定请求事件
字符串API match和indexOf非常相似,都是查找有没有,但match支持正则,不关心结果是什么,只关心结果为不为null
var rs=str.match(reg)
第三方模块
自定义模块:
1.文件模块:创建xx.js去公开需要公开的内容,主模块引入,就必须写为require("模块路径")
2.目录模块:
1.比如创建m1的文件夹,在其中创建index.js的文件,公开了需要公开的内容,主模块引入,就必须写为require("./m1")
2.比如创建m2的文件夹,在其中创建xx.js的文件,公开了需要公开的内容,主模块引入,就必须写为require("./m2")
3.创建一个文件夹必须名为node_modules,再在其中创建一个m3文件夹,在其中创建index.js的文件,公开了需要公开的内容,主模块引入,就必须写为require("m3")
mongo
是基于json的数据库:JSON就是JavaScript Object Notation - JS的一部分,所以用法和JS很相似,都是再用.去调用操作
语法:都是在客户端cmd输入 - 数据库里面就是专门放跟你的项目相关的数据的
1、数据库的操作:
1、查询所有的数据库:show dbs
2、创建/切换数据库:没有就是创建,有了就是切换:use 数据库名称;
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([{键值对,...},{键值对,...},{键值对,...},{键值对,...}])
举例:db.user.save([{name:"1",pwd:"969696",age:20,email:"pg@qq.com",vip:1},{name:"2",pwd:"666666",age:16,email:"dwj@qq.com",vip:0},{name:"3",pwd:"999999",age:19,email:"xhx@qq.com",vip:1}]);
2、删:db.表名.remove({}); - 不推荐,删除数据库中所有的数据
db.表名.remove({条件}) - 条件依然是键值对的写法,比如:db.user.remove({name:"1"})
3、改:db.表名.update({条件},{$set:{新内容}})
举例:db.user.update({age:19},{$set:{email:"xhx@qq.com"}})
4、查:db.表名.find({}) - 找所有
db.表名.find({vip:0}) - 只想找到所有vip为0的人,说白了大括号里面放着的是条件,想写多个条件也是可以的
db.表名.find({},{name:1,pwd:1}) - 找到所有的数据,但是只返回name和pwd(登录),1为需要,0为不需要
db.表名.find({}).sort({age:1}) - 按age升序排列,1为升序,-1为降序
db.表名.find({age:{$gt:18}}) - 拿到所有age大于18岁的数据,gt大于 lt小于 gte大于等于 lte小于等于(只想拿到成年人)
db.表名.find({name:/吴/}) - 甚至可以使用正则(模糊查询)
db.表名.find({}).skip(2).limit(2) - 跳过前2条,再拿2条(点击分页条应该拿到哪些数据)
db.表名.find({}).count() - 获取到此表有多少条数据
Node.js操作mongoDB - Node.js
1、下载安装第三方模块:mongoose
2、使用步骤:
1、引入:var mongoose=require("mongoose")
2、连接数据库:mongoose.connect("mongodb://127.0.0.1/数据库名称");
3、//创建/选中出一个新的数据表的同时,设置数据类型的控制,防止用户乱输
var UserSchema=mongoose.Schema({
name:String,
pwd:String,
age:Number,
email:String,
vip:String
})
var User=mongoose.model("User",UserSchema,"数据表名");
4、增:2步
1、创建要插入的对象
var x=new User({
name:"paoge1",
pwd:"999999",
age:"128",
email:"pg@qq.com",
vip:"0"
})
2、存储到数据库之中
x.save().then(()=>{
//新增完毕后,要干什么,必须放在这个函数里面,因为他是异步的操作
})
5、删:
User.deleteOne/deleteMany({条件}).then(()=>{
//删除完毕后,要干什么,必须放在这个函数里面,因为他是异步的操作
})
6、改:
User.updateOne/updateMany({条件},{新内容}).then(()=>{
//更新完毕后,要干什么,必须放在这个函数里面,因为他是异步的操作
})
7、查:
User.find({条件}).then((rs)=>{
rs -> 查询到的JSON数据
})
Ajax
概念:
同步交互:用户向服务器端发起请求,直到服务器端进行响应的全过程,用户是不可以做其他事情的(等)
典型:网址提交、表单提交 - 都是属于同步交互
异步交互:用户向服务器端发起请求,直到服务器端进行响应的全过程,用户是可以做其他事情的(不等)
典型:ajax请求
AJAX:Asynchronous JavaScript And XML - 异步的js和xml
不严格的定义:页面不完全刷新,只会导致页面局部发生变化的技术
其实我们早就见过异步技术/代码了:
1、定时器 - 做特效
2、Node操作mongo的增删改查 - 后端技术
3、ajax - 目的:在不刷新页面的情况下和服务器端进行交互 - 可以将服务器端的数据放到前端(比较验证、数据渲染)
2、如何使用:固定步骤 - 4步
1、创建ajax核心对象
var xhr=new XMLHttpRequest();
2、前端建立和服务器端的连接
xhr.open("GET/POST","/路由");
3、向服务器端发送请求消息
xhr.send("key=value&...");
特殊:
1、GET:send方法会失效,但是还不能省略,必须写为null
xhr.open("GET","/路由?key=value&...");
xhr.send(null);
2、POST:send方法可用,必须写为:- 暂时不用
xhr.open("POST","/路由");
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xhr.send("key=value&...");
4、绑定状态监听事件
xhr.onreadystatechange=()=>{
if(xhr.readyState==4&&xhr.status==200){
xhr.responseText;//得到后端响应的内容,难就难在这个点,你拿到了数据要干什么?
}
}