Node.js、ajax、mongo数据库学习

78 阅读6分钟

Node.js

模块

每一个模块都有一个操作可以公开/暴露自己的成员

语法:

  • exports.属性名=值
  • module.exports.属性名=值
  • module.exports={属性名:值}

exports和module.exports的区别

  • 语法、写法、用法不同
  • exports=module.exports,exports={}//创建了一个空对象,把module.exports覆盖了

每个主模块都可导入/引入其他模块

语法var x=require("路径")

模块分类

官方模块require("官方模块名")

Global模块:不需要引入,可以直接使用

Golbal提供了五个预定义变量
  • __filename获取到当前文件的完整的绝对路径
  • __dirname获取到当前文件的完整的绝对路径,不包含文件的名字
  • exports空对象,可以用于公开暴露自己的成员
  • require函数,可以用于导入其他模块
  • module指代当前模块本身,甚至包含以上几个操作
定时器(周期性、一次性、瞬间定时器)用法一样,瞬间定时器无用,等效于一次性时间设为0
console用法一样

querystring模块:需要引入

  • 引入:var qs=require('querystring')解析url中查询字符串部分功能
  • var obj=qs.parse('请求消息')获取前端传来的每一个部分:obj.键名

缺点:不能解析完整的url路径

url模块:需要引入

  • 引入:var url=require('url')解析url中各个部分功能
  • var obj=qs.parse('请求消息',true)支持第二个参数,是一个布尔值,默认为false,一旦设置为true,就会自动释放querystring的parse方法去解析查询字符串部分

Buffer模块:不需要引入

可以将数据变成一个16进制的数字,node.js的一些API会自动把数据转为Buffer,但node.js的大部分API支持Buffer

fs模块:需要引入

引入:var fs = require('fs')

//异步读取文件
fs.readFile(__dirname+"文件路径",(err,buf)=>{
    操作
})
//异步写入文件:会替换掉原来的东西
fs.writeFile(__dirname+"文件路径","新内容",(err)=>{
    操作
});
//异步追加文件:不会替换掉原来的东西
fs.appendFile(__dirname+"文件路径","新内容",(err)=>{
    操作
});
  • 参数err,没什么用,错误的意思
  • 参数buf读取文件,返回的内容,是Buffer类型的
  • 因为是异步,操作只能放在函数里面

http模块:需要引入

引入:var http=require("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 - response(响应)对象,他有一个方法res.end("响应东西"/buf) - 可以让前端不再转圈圈,我们回答了他,让她看到想要的东西
		fs.readFile("./public/html/index.html",(err,buf)=>{
			res.end(buf)
		})
	}
})
扩展:字符串API

match和indexOf非常相似,都是查找有没有,match支持正则,没有找到返回nullvar rs=str.match(reg);

自定义模块require("./模块路径")

文件模块

创建xx.js去公开了需要公开的内容,主模块引入,就必须写为require("./模块路径")

目录模块

  • 比如创建m1的文件夹,在其中创建index.js的文件,公开了需要公开的内容,主模块引入,就必须写为require("./m1");
  • 比如创建m2的文件夹,在其中创建xx.js的文件,公开了需要公开的内容,主模块引入,就必须写为require("./m2");
    • 必须在其中创建一个package.json的配置文件,写入:{"main":"xx.js"}
  • 创建一个文件夹必须名为node_modules,再在其中创建m3文件夹,在其中创建index.js的文件,公开了需要公开的内容,主模块引入,就必须写为require("m3");

第三方模块

  • 打开npm网址:www.npmjs.com 搜索你需要用到的模块,尽量用带有完全符合标签的那个包,或者是第一个包
  • 在你的项目中打开cmd
    • 下载:npm i 包名;
    • 更新:npm up 包名;
    • 删除:npm un 包名;
  • 检查npm是否安装成功:npm -v

mongo数据库

安装

第一步启动服务器

  • 打开里面的bin文件夹在里面打开cmd输入:.\mongod.exe --dbpath=路径路径保存着你以后要存储的所有数据

第二步启动客户端

  • 再打开一个cmd输入:.\mongo.exe

操作数据库语法:都是在客户端cmd输入

  • show dbs查看所有数据库
  • use 数据库名称创建/切换数据库,没有就创建,有就切换
  • db查看当前选中的数据库
  • db.createCollectiom('表名')创建数据表
  • db.dropDatabase()删除数据库

操作数据表

  • db.表名.save({键值对,....})增加,一次只能插入一条数据
    • db.表名.save({键值对,....},{键值对,....})一次插入多条
  • db.表名.remove({})删除,删除数据库中所有的数据
    • db.表名.remove({条件})条件依然是键值对的写法,满足这个条件的才删除
  • db.表名.update({条件},{$set:{新内容}})修改
  • db.表名.find({}) 查找所有
    • db.表名.find({条件}) 查找所有满足这个条件的
    • db.表名.find({},{键:1,键:0})查找所有数据,只返回需要的,1为需要,0为不需要
    • db.表名.find({}).sort({键:1})按照键升序排列:1升序,-1降序
    • db.表名.find({键:{$gt:18}})拿到所有键大于18的数据,gt大于,lt小于,gte大于等于,lte小于等于
    • db.表名.find({name:/A-z/})可以支持正则模糊查询
    • db.表名.find({}).skip(n).limit(m)从第n条开始拿m条数据
    • db.表名.find({}).count()获取此表有多少条数据

node.js操作mongoDB

下载安装第三方模块:mongoose

使用

引入:var mongoose=require("mongoose")

连接数据库:mongoose.connect("mongodb://127.0.0.1/数据库名称");

创建/选中出一个新的数据表的同时,设置数据类型的控制,防止用户乱输

var UserSchema=mongoose.Schema({
    键:值类型
})
var User=mongoose.model("User",UserSchema,"数据表名");

增加

//创建要插入的对象
var x=new User({
    键:值
})
//存储到数据库之中
x.save().then(()=>{
    //操作,因为这是异步的
})

删除

User.deleteOne/deleteMany({条件}).then(()=>{
    //操作,因为这是异步的
})

修改

User.updateOne/updateMany({条件},{新内容}).then(()=>{
    //操作,因为这是异步的
})

查找

User.find({条件}).then((rs)=>{
    rs -> 查询到的JSON数据
})

ajax

使用

//固定步骤
创建ajax核心对象
var xhr=new XMLHttpRequest();
//前端建立和服务器端的连接
xhr.open("GET/POST","/路由");
//向服务器端发送请求消息
xhr.send(null);
//绑定状态监听事件
xhr.onreadystatechange=()=>{
    if(xhr.readyState==4&&xhr.status==200){
        xhr.responseText;//得到后端响应的内容
    }
}

特殊:

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&...")