Node.js的学习

93 阅读7分钟

Node.js的概述

不是js,但是语法和js非常类似,和数据库进行交互,成为前端到数据库的一个桥梁

Node.js如何运行

  1. 交互模式:打开cmd输入:node回车
  2. 脚本/文件模式:
    1. 先创建xx.js,里面书写自己的代码
    2. 打开cmd输入:Node文件的绝对路径

Node.js知识点

  1. js和Node的区别
    1. 相同点:都可以使用一切的ECMAScript(那11个)的东西,包括一切API,都可以使用,不必担心ES5/ES6的兼容性问题
    2. Node没有BOM和DOM

模块(module):每一个xx.js,都可以称为一个模块

  1. 每一个模块都有一个操作,可以用于公开/暴露自己的成员
    Node.js自带一个预定义变量:exports,可以直接使用,是一个对象
    语法:
    1. exports.属性名=值;
    2. module.exports.属性名=值;
    3. module.exports={属性名:值,....}
  2. 每一个模块都可以导入/引入其他模块 Node.js自带一个预定义函数:require,可以直接使用,是一个函数,放在此函数里面的路径就算允许引入的模块文件
    语法:
    1. var x=require("./路径"); ./不能省略

模块的分类

官方模块

  1. Global模块:不需要引入,可以直接使用的,提供了5个预定义变量

    1. __filename;获取到当前文件的完整的绝对路径
    2. __dirname;获取到当前文件完整的相对路径
    3. exports;空对象,可用来公开暴露自己的成员
    4. require;函数,可以用于导入其他模块
    5. module;代指当前模块本身
  2. querystring模块:解析查询字符串,使其变成一个对象,可以获取到前端传到后端的消息

    1. 需要引入:var qs=require("querystring");
    2. 作用:解析url中查询字符串部分的功能
    3. var obj=qs.parse("查询字符串/请求消息");
    4. 获取前端传来的每一个部分:obj.键名
  3. url模块

    1. 需要引入: var url=require('url')
    2. 作用:解析url种各个部分的功能
    3. var objUrl=url.parse(str,true);支持第二个参数,是一个布尔值,默认为false,一旦设置为true,就会自动释放querystring的parse方法去解析查询字符串部分
    4. 路由/文件相对路径/请求地址:objUrl.pathname判断路由的不同,去读取不同的HTNL发送给用户看
    5. 查询字符串/请求消息:objURL.query.键名(前端form(get)传到后端的东西)
  4. Buffer模块:缓冲区,可以将数据变成一个16进制的数字,可以理解为是Node.js中的一种新的数据类型,不需要引入的,可以直接使用的,但是Node.js的一些API可能会导致我们被动得到Buffer,Node.js中大部分API,都是支持Buffer,所以可以直接使用

  5. fs模块 FileSystem

    1. 需要引入:var fs=require("fs");
    2. 异步读取文件:
      fs.readFile(__dirname+"文件路径",(err,buf)=>{
      console.log(buf);要进行任何操作都要放在函数内部,因为是一个异步函数
      })
    3. 异步写入文件:
      fs.writeFile(__dirname+"文件路径","新内容"(err)=>{
      console.log(buf);要进行任何操作都要放在函数内部,因为是一个异步函数
      })
    4. 异步追加文件:
      fs.appendFile(__dirname+"文件路径","新内容"(err)=>{
      console.log(buf);要进行任何操作都要放在函数内部,因为是一个异步函数
      })
  6. http模块:搭建服务器和文件系统

    1. var http=require("http");
    2. var url=require("url");
    3. var fs=require("fs");
    4. var app=http.createServer();
    5. app.listen(80);
    6. app.on("request",(req,res)=>{
      req-request(请求)对象,有一个属性req.url,获取到前端传到后端的路由和请求消息,但是路由和请求消息是融为一体的,不方便我们获取某个部分,所以我们可以引入url模块,进行解析!分开两个部分!
      var objUrl=url.parse(req.url,true);

    var router=objUrl.pathname
    //单独获取到了路由
    if(router=="/"){ fs.readFile("./public/html/index.html",(err,buf)=>{res.end(buf) }) }) })
    扩展:字符串还有一个API:match和indexOf非常相似,都是查找有没有的,但是支持正则,我们不关心结果是什么,我们只关心结果为不为null
    var rs=str.match(reg);

自定义模块

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

第三方模块

npm工具:Node Package Manager:Node.js的模块/包/软件管理器,专门用于管理第三方模块的,作用:下载、更新、删除、维护包之间的依赖关系
检查npm是否安装成功:打开cmd:npm -v 如果能看到版本号,说明安装成功
打开npm网址:www.npmjs.com
搜索你需要用到的模块,尽量用带有完全符合标签的那个包,或者是第一个包
【在你的项目中打开cmd】
下载:npm i 包名;
更新:npm up 包名;
删除:npm un 包名;

mongo

mongo的语法:都是在客户端cmd输入

  1. 数据库的操作
    1. 查询所有的数据库:show dbs
    2. 创建/切换数据库:没有是创建,有了就是切换:use 数据库名称
    3. 查看当前选中的数据库:db
    4. 创建数据表:db.createCollection("表名");
    5. 删除数据库:db.dropDatabase();
  2. 数据表的操作:
    1. 查看目前所有的数据表:db.getCollectionNames();
    2. 删除数据表:db.表名.drop();
  3. 数据的操作
    1. 增:db.表名.save({键值对,...})一次只能插入一条数据
      db.表名.save({[键值对,...,][键值对,...]});
    2. 删:db.表名.remove({条件})
    3. 改:db.表名.update({条件},{$set:{新内容}})
    4. 查:db.表名.find({}) 找所有
      1. db.表名.find({vip:0}) - 只想找到所有vip为0的人,说白了大括号里面放着的是条件,想写多个条件也是可以的
      2. db.表名.find({},{name:1,pwd:1}) - 找到所有的数据,但是只返回name和pwd(登录),1为需要,0为不需要
      3. db.表名.find({}).sort({age:1}) - 按age升序排列,1为升序,-1为降序
      4. db.表名.find({age:{$gt:18}}) - 拿到所有age大于18岁的数据,gt大于 lt小于 gte大于等于 lte小于等于
      5. db.表名.find({name:/吴/}) - 甚至可以使用正则(模糊查询)
      6. db.表名.find({}).skip(2).limit(2) - 跳过前2条,再拿2条(点击分页条应该拿到哪些数据)
      7. db.表名.find({}).count() - 获取到此表有多少条数据(做出分页条)

Node.js操作mongoDB

  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
      })
  3. 增:2步
    1. 创建要插入的对象:var x=new User({键值对,键值对...})
    2. 存储到数据库:x.save().then()=>{新增完之后的操作必须放在函数内部,因为是异步函数
  4. 删:
    1. User.deleteOne/deleteMany({条件}).then(()=>{更新完之后的操作必须放在函数内部,因为是异步函数})
  5. 查:
    1. User.find({条件}).then((rs)=>{rs为查询到的json数据}) 条件的写法和mongo的语法一样

Ajax

  1. 同步交互和异步交互

    1. 同步交互:用户向服务器端发起请求,直到服务器端进行响应的全过程,用户是不可以做其他事情的(等)
      典型:网址提交、表单提交 - 都是属于同步交互
    2. 异步交互:用户向服务器端发起请求,直到服务器端进行响应的全过程,用户是可以做其他事情的(不等)
      典型:Ajax请求
  2. Ajax:Asynchronous JavaScript And XML - 异步的js和xml

  3. 如何使用Ajax

    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"."/路由");
  4. 绑定状态监听事件

    1. xhr.onreadystatechange=()=>{
      if(xhr.readyState==4&&xhr.status==200){
      xhr.responseText;//得到后端响应的内容,难就难在这个点,你拿到了数据要干什么?}