Node.js
1.模块(module)
每一个xx.js都可以称之为一个模块;
Node.js自带一个预定义变量:exports,可以直接使用,是一个对象,放在此对象里面的东西是允许公开的。
语法:1.exports.属性名=值;
2.module.exports.属性名=值;
3.module.exports={
属性名:值;
...
}
2.每一个模块都一个操作,可用于导入/引入其它模块
Node.js自带一个预定义函数:require,可以直接使用,放在此函数里面的路径,就是允许引入的模块文件。
语法:var x=require("./路径");
exports和module.exports的区别?
1.语法、写法、用法不同
2.都是用于公开暴露自己的成员
但是exports={},写法是错误的。
其实Node.js底层是:exports=module.exports;
真正做公开功能的是module.exports;
如果用了exports={};相当于创建了一个空对象,把module.exports覆盖了,所以不再具有公开的功能了。
3.模块的分类:
官方模块 第三方模块 自定义模块
官方模块:
1.Global模块:不需要引入,可以直接使用的
提供了五个预定义变量,可以直接使用
① __filename;
② __dirname;获取到当前文件的完整的绝对路径,不包含文件的名字。
③ exports - 空对象,可以用公开暴露自己的成员。
④ require - 函数,可用于导入其它模块
⑤ module - 指当前模块自身,甚至包含以上几个操作。
2.querystring模块:解析查询字符串,使其变成一个对象,可以获取到前端传到后端的消息。
需要引入:var qs = require("querystring");
作用:用于解析url中查询字符串部分的功能。
var obj = qs.parse("查询字符串/请求消息");
获取前端传来的每一个部分:obj.键名;
3.url模块
需要引入:var url = require("url");
作用:解析url中各个部分的功能
var objUrl = url.parse(str,true);支持传入第二个参数,是一个布尔值,默认为false。
一旦设置为true,就会自动释放querystring的parse方法去解析查询字符串部分。
objUrl.pathname;请求地址/路由/文件的相对路径
objUrl.query.键名;查询字符串/请求消息
4.Buffer模块:
缓冲区,可以将数据变成一个16进制的数字,可以理解为Node.js的一种新数据。
不需要手动使用它,不需要引入,可以直接使用的,因为Node.js中大部分API都支持Buffer。
5.fs模块,文件系统模块
需要引入:var fs = require("fs");
读取文件:
fs.readFile(__dirname+"文件路径",(err,buf)=>{
读取到的东西,读取过后要干什么,必须放在此回调函数里面,千万不要放在外面
});
写入文件:
fs.writeFile(__dirname+"文件路径","新内容",(err)=>{
});
追加文件:
fs.appendFile(__dirname+"文件路径","新内容",(err)=>{
});
http模块
1.http模块:搭建服务器&文件系统,是需要引入的
var http = require("http")
var url = require("url")
var fs = require("fs")
var app = http.createServer()
app.listen(80)
//为其绑定请求事件:http/https 请求 - 响应模型,必须要有一个请求(前端),才能有一个响应(后端)
app.on("request",(req,res)=>{
req - request(请求)对象,它有一个属性req.url,获取到前端传到后端的路由和请求消息,
但路由和请求消息是融为一体的,不方便我们获取某个部分,所以可以引入url模块进行解析,分开两个部分
var objUrl = url.parse(req.url,true)
var router = objUrl.pathname
//判断路由读取不同的页面给用户看
if(router=="/"){
res.end("响应东西"/buf)可以让前端不再转圈
fs.readFile("文件路径",(err,buf)=>{
res.end(buf)
})
}else if(router=="/newshtml"){
fs.readFile("newshtml的文件路径",(err,buf)=>{
res.end(buf)
})
}...
})
扩展:字符串还有一个API:match和indexOf非常相似,都是查找没有的,但支持正则,不关心结果是什么,
只关心结果不为null
var rs = str.match(reg)
MongoDB
mongo是基于json的数据库
启动:在bin文件夹输入:.\mongod.exe --dbpath="想要保存的绝对文件夹路径"
再打开一个cmd,输入.\mongo.exe - 再上一个cmd可以查看我们是否连接成功 - 客户端开启成功。
① 数据库的操作:
1.查询所有的数据库:show dbs
2.创建或切换数据库:没有就是创建,有就是切换:use 数据库名称
3.查看当前选中的数据库:db
4.创建数据表:db.createCollection("表名") - 一定要先创建数据表,才能查看到自己创建的数据库
5.删除数据库:db.dropDatabase();
② 数据表的操作
1.创建数据表:db.createCollection("表名",{限制条件/可写可不写})
2.查看目前所有的数据表:db.getCollectionNames();
3.删除数据表:db.表名.drop();
③ 数据的操作
1.增:db.表名.save({键值对,...}) - 一次只能插入一条数据
db.表名.save([{键值对,...},{键值对,...},{键值对,...}...]) - 一次插入多条数据
2.删:db.表名.remove({条件}) - 删除数据库中所有的数据
3.改:db.表名.update({条件},{$set:{新内容}})
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
下载安装第三方模块:mongoose
使用步骤
引入:var mongoose = require("mongoose");
连接数据库:mongoose.connect("mongodb:127.0.0.1/数据库名称");
创建/选中出一个新的数据表的同时,设置数据类型的控制,防止用户乱输
var Userschema=mongoose.Schema({
name:String,
pwd:String,
age:Number,
...
})
var User = mongoose.model("user",UserSchema,"数据表名");
增:2步
1.创建要插入的对象
var x = new User({
name:"p1",
pwd:"888888",
})
x.save().then(()=>{
})
删:
User.deleteOne/deleteMany({条件}).then(()=>{
})
改:
User.updateOne/updateMany({条件},{新内容}).then(()=>{
})
查:
User.find({条件}).then((rs)=>{
rs -> 查询到的json数据
})
AJAX
概念:Asynchronous JavaScript And XML - 异步的js和xml
目的:在不刷新页面的情况下和服务器端进行交互 - 可以将服务器端的数据放到前端(比较验证、数据渲染)
如何使用:
1.创建Ajax核心对象
var 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");
xhr.send("key=value&...");
4.绑定状态监听事件
xhr.onreadystatechange=()=>{
if(xhr.readyState==4&&xhr.status==200){
xhr.responseText;
}
}