学习Node.js、MongoDB、Ajax

74 阅读6分钟

Node.js

1.模块(module)
   每一个xx.js都可以称之为一个模块;
   Node.js自带一个预定义变量:exports,可以直接使用,是一个对象,放在此对象里面的东西是允许公开的。
   语法:1.exports.属性名=值;
        2.module.exports.属性名=值;
        3.module.exports={
            属性名:值;
            ...
          }

2.每一个模块都一个操作,可用于导入/引入其它模块
    Node.js自带一个预定义函数:require,可以直接使用,放在此函数里面的路径,就是允许引入的模块文件。
    语法:var x=require("./路径");
    exportsmodule.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都支持Buffer5.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:{新内容}}) //改掉在xxx条件中的数据里面的其它条件的内容。
    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,"数据表名");
增:21.创建要插入的对象
    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;//得到后端响应的内容,拿到数据要干什么
            }
        }