我的JS第五周

107 阅读6分钟

Node.js

检查安装成功

node -v回车

如何运行:

1、交互模式:node回车,开始!

2、node 文件的绝对路径

3、vscode-插件:code runner 右键第一个

js和node的区别:

 1、JS:ES+BOM+DOM
 2、Node:没有BOM和DOM

模块(module)

每一个xx.js都可以称之为模块

每个模块都有一个操作,可以用于公开自己的成员,Node.js自带一个预定义变量:exports,可以直接使用,是一个对象,放在此对象的东西是允许公开的

语法:

  ①:exports.属性名=值
  ②module.exports.属性值=值
  ③module.exports={
      属性名:值,
      ...}

每个模块:都有一个操作可以导入其他模块

Node.js自带一个预定义函数:require,可直接使用,是一个函数,放在此函数里面的路径,就是允许引入的模块文件

语法:

let x=require("./路径")//./不可省略

面试题:exports与module.exports的区别?

①语法、用法、写法不同

②都用于公开自己的成员:但是exports={}的写法是错误的,Node.js的底层:exports=module.exports其实真正做公开功能的是module.exports若是使用了exports={},就相当于是创建了一个空对象,将module.exports给覆盖了

模块的分类

1、官方模块:无需下载

2、第三方模块:npm有很多

3、自定义模块

官方模块:不需要引入,可直接使用

①global不需要引入,可直接使用

五个预定义变量:
    1__filename:获取当前文件的完整绝对路径,无用
    ***2__dirname:获取当前文件的完整绝对路径,但不包含文件名
    *3exports对象:空对象,用于公开自己的成员
    *4require:函数,导入其他的模块
    **5module:指当前模块本身,包含以上四个操作

②定时器:周期,一次性,瞬间;瞬间就等效于设置为0的一次性

③console:用法和以前一样

querystring模块

解析查询字符串,使其变成一个对象,可以获取到前端传到后端的消息(请求消息)

引入: let qs=require("querystring")
作用:解析url中部分功能
let obj=qs.parse("查询字符串/请求消息")
获取:obj.键名   若是前端传过来是一个完整的url就无法解析

### url模块

引入:let url=require("url")
作用:解析url的各个部分
let objUrl=url.parse(str,true);默认为false,若为true则为自动解析查询字符串部分
*objUrl.pathname:判断路由的不同,传输不同页面数据
*objUrl.query.键名:查询请求信息

Buffer:缓冲区,Node.js大部分API都支持

fs模块

Filesystem文件系统:let fs=require("fs")

异步读取文件:

fs.readFile(__dirname+"文件路径",(err,buf)=>{
    读取到过后要干什么,必须放在回调函数中,不放外面
})

异步写入文件:

fs.writeFile(__dirname+"文件路径","新内容",(err)=>{
    干什么放在这里就可以了,会替换掉元凯的东西
})

异步追加文件:

fs.appenFile(与上面一致)//不会替换原来的东西

只有异步才能发挥Node.js的优点(快)

http模块

超级重点!搭建服务器&文件系统,需要导入

let http=require("http");
let url=require("url");
let fs=require("fs");
let app=http.creatServer();//创建一个服务器应用
app.listen(80);//为其绑定端口号,默认端口号可省略
app.on("request",(req,res)=>{
    //req-request(请求对象)u哦一个req.url属性,获取前端的请求信息,但是路由与请求信息是一体的,不方便获取某个部分,所以我们引入了url模块进行解析
    let objUrl=url.parse(req.url,true);
    let router=objUrl.pathname'//获取路由
    if(router=="/"){//判断路由
    //res有一个方法res.end("响应东西"/buf)响应对象
    fs.readFile("路径",(err,buf)=>{
        res.end(buf)
    })
    }
    else if(router=="./news.html"){
        fs.readFile("路径",(err,buf)=>{
            res.end(buf)
        })
    }
})

扩展:字符串还有一个API:match,与indexOf相似,但是支持正则,不关心结果是什么,但是没有就是null,用它可以做判断

let rs=str.match(reg)

强调:一切的herf,src,action都是一个请求和路由

模块的分类

1、官方模块:require("官方模块")

2、第三方模块:npm有很多

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

自定义模块

分为两大类:

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

2、目录模块:3种

①创建m1的文件夹,在其中创建了index.js文件公开了需要公开的内容,主模块引入,就必须写为require("./m1")

②创建m2的文件夹,在其中创建了xx.js文件公开了需要公开的内容,在m2中创建了package.json的配置文件写入{"main":"xx.js"},主模块引入,就必须写为require("./m2")

③创建了一个文件名必须为node_modules,在其中创建了m3文件夹,之后创建了index.js公开,主模块引入必须写为require("m3")

第三方模块

npm工具:专门用于管理第三方模块,作用:下载,更新,删除,维护包之间的关系

(在项目中打开cmd)
下载:npm i 包名
更新:npm up 包名
删除:npm un 包名

mango

是基于json的数据库

1、启动:

 在bin文件夹打开cmd,输入:.\mogod.exe --dbpath=文件路径
 (不可关闭mango服务器的cmd)

2、语法:

查询所有的数据库:show dbs
创建/切换数据库,没有就是创建:use 数据库名
查看当前选中的数据库:db
创建数据表:db.creatCollection("表名")
删除数据库:db.dropDatabase()不推荐,要坐牢

数据表的操作:

创建数据表:db.createCollection("表名")
查看目前所有数据表:db.getCollectionNames()
删除数据表:db.表名.drop()不推荐

数据的操作:

增:db.表名.save({键值对},{})
删:db.表名.remove({条件})//条件也是键值对
改:db.表名.update({条件},{$set:{新内容}})
*查:db.表名.find()找所有
db.表名.find({条件})找到符合条件的人
db.表名.find({},{name:1,_id=0})//找所有人,但是只要name,1表示要,0表示不要
db.表名.find({}).sort({age:1})按age升序排列,1代表升序,-1代表降序
db.表名.find({age:{$gt18}})拿到age大于18的数据,gt大于,lt小于,gte大于等于,lte小于等于
db.表名.find({name:/吴/})正则,模糊查询
db.表名.find({}).skip(i).limit(j)找所有,跳过i条再拿j条
db.表名.find({}).count()获取有多少条数据,可用来做分页器

Node.js操作mongoDB

使用:

1、引入:let mongoose=rquire("mongoose")
2、链接数据库:mongoose.connect("mongodb://127.0.0.1/数据库名")
3、创建一个数据表的同时设置类型的控制,防止用户乱输:
let UserSchema=mongoose.Schema({
    name:String,
    pwd:String,
    age:Number,
    email:String,
    vip:String
})
let User=mongoose.model("User",UserSchema,"表名")//选择数据表
4、增:创建要插入的对象:
let x=new User({
    name:值,
    pwd:值,
    age:值,
    email:值,
    vip:值
})
存储到数据库中:
x.save().then(()=>{
    //增加之后的操作放这里
})
5、删:
User.deleteOne/deleteMany({条件}).then(()=>{
     //删除之后的操作放这里
})
6、改:
User.updateOne/updateMany({条件},{新内容}).then(()=>{
    //更新之后的操作放这里
})
7、查:
User.find({条件}).then((rs)=>{
    rs->查询到的json数据
})

tips:form表单有一个action,后端可以objUrl.query得到

AJAX

1、概念:

同步交互:用户向服务器发起请求,直到服务器端响应的全过程,用户是不可以进行操作的

异步交互:用户向服务器发起请求,直到服务器端响应的全过程,用户是可以进行操作的

异步代码/技术: 1、定时器

2、Node中的数据库的增删改查

3、Ajax:在不刷新页面的情况下和服务器端进行交互

如何使用:

   1、创建AJAX的核心对象
       let 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)
   4、绑定监听事件
       xhr.onreadystatechange=()=>{
           if(xhr.readyState==4&&xhr.status==200){//链接无问题
               xhr.responseText//后端响应的数据
           }
       }