error对象:方便程序员更快的找到自己的错误,以提高效率
1. 浏览器自带4大错误提示:
1、语法错误:SyntaxError - 一定是你的符号/语法写错
2、引用错误:ReferenceError - 没有创建就去使用了
3、类型错误:TypeError - 不是你的方法,你却去使用了
4、范围错误:RangeError - 只有num.toFixed(d);会出现//d取值范围:0~100之间
5、自定义错误:throw new Error("自定义错误消息") --他是一个我们自定义的一个报错信息。
2. 错误处理:只要出现错误,代码就会自动停止执行。(把错误变成提示,让后续代码继续执行)
语法:
try{
放入可能出错的代码
}catch(err){
发生错误后才会执行的代码(err保存的是报错的信息)
}
可以使用分支技术代替try...catch...(大多数是使用分支技术处理错误)
3. ES5 出现严格模式
语法:"use strict" - 写在任何一个作用域的顶部都可以
作用:禁止了全局污染;会将静默失败悄悄升级为报错,导致程序停止运行
匿名函数: 自调和回调
1、自调函数语法:(function(){操作})()
作用:会释放所有没有用的变量;
建议:把所用的代码使用自调函数包起来。
2、回调函数:为了简化为箭头函数(在箭头函数中注意this的指向)
node.js:不是js,但是与js的使用十分相似。****
优点:速度快。(会把数据转化为字符串。字符串的传输速度最快)
1. 使用步骤:
1、安装node.js运行环境
2、检查是否安装成功命令-- 打开cmd输入:node -v
3、运行node.js的三种运行模式
(1)交互模式
打开cmd输入:node回车,你就可以开始敲你的“js”代码
(2)文件模式
先写好js文件,然后打开cmd输入:node 文件的绝对路径
(3)编译器安装插件
打开编译器中的扩展应用,找到相应的node.js插件进行安装
2. 模块
(1)模块的分类
官方模块:常用的6个模块;
1、Global模块:不需要引入的,可以直接使用
(1)五个预定义变量,可以直接使用了
1、__filename - 获取到当前文件完整的绝对路径
2、__dirname - 获取当前文件绝对路径,不包含文件的名字
3、exports - 空对象,可以用于公开暴露自己的成员
4、require - 函数,可以用于导入其他模块
5、module - 指代当前模块本身,甚至包含着以上4个操作
2、querystring模块:解析查询字符串,使其变成一个对象.(前端传到后端的消息-请求消息)
需要引入:let qs = require('querystring');
作用:解析url中查询字符串部分的功能
let obj=qs.parse("查询字符串");
想要获得前端传来的每一个部分:obj.键名;
3、url模块
需要引入:let url = require('url');
作用:解析url中各个部分的功能
let objUrl=url.parse("完整的url",true);
1、查询字符串/请求消息:objUrl.query.键名
2、路由:objUrl.pathname
4、Buffer模块:缓冲区,可以将数据变成一个16禁止的数字.
5、fs模块
需要引入:let fs = require('fs');
读取文件:
fs.readFile(文件路径,(err,buf)=>{//buf代表的是读取到的内容
操作
})
写入文件:
fs.writeFile(文件路径,"新内容"/buf,(err)=>{
操作
})//会替换掉原来的东西
追加文件:
fs.appendFile(文件路径,"新内容"/buf,(err)=>{
操作 })
注意:写入文件和追加文件时,当文件路径不对时会创建文件
6、http模块--搭建服务器的关键模块
创建文件服务系统步骤:
let http=require("http");
let url=require("url");
let fs=require("fs");
let app=http.createServer();
app.listen(80);
app.on("request",(req,res)=>{
let objUrl=url.parse(req.url,true);
let router=objUrl.pathname;
if(router=="/"||router=="/index.html"){
fs.readFile(__dirname+"/public/html/index.html",(err,buf)=>{
res.end(buf)
})
}
else if(router.match(/html/)!=null){
fs.readFile(__dirname+/public/html${router},(err,buf)=>{
res.end(buf)
})
}
else if(router.match(/css|js|jpg|png|gif|woff|woff2|ttf2/)!=null){
fs.readFile(__dirname+/public${router},(err,buf)=>{
res.end(buf)
})
}
})
第三方模块:使用NPM 下载第三方模块
常见语法:
1、下载:npm i 包名
2、删除:npm un 包名
3、更新:npm up 包名
mongoose模块:操作数据库的模块
用node.js操作mongoose模块步骤:
1、引入:let mongoose=require("mongoose");
2、连接数据库:mongoose.connect("mongodb://127.0.0.1/数据库名");
3、创建出一个新的数据表的同时,设置数据类型的控制,防止用户乱输
var UserSchema=mongoose.Schema({
键名:数据类型
})//根据前端的数据创建相应的数据类型和键名
letUser=mongoose.model("User",UserSchema,"user")//创建表
4、增:
1、创建要插入的对象
let x=new User({键值对})
2、创建好的对象插入到数据表中
x.save().then(()=>{操作})
5、删:
User.deleteOne/deleteMany({条件}).then(()=>{操作})
6、改:
User.updateOne/updateMany({条件},{新内容).then(()=>{操作})
7、查:
User.find({条件}).then((rs)=>{rs操作})//rs表示查询到的内容
注意:在增删改查中条件都是键值对的形式出现
自定义模块:分为两大类
1、文件模块:创建xx.js去公开了需要公开的内容,主模块引入,就必须写为require("./模块路径");
2、目录模块文件夹中只能放一个文件:3种(不常用)
1、比如创建m1的文件夹,在其中创建必须名为index.js的文件,去公开了需要公开的内容,主模块引入,就必须写为require("./m1");
2、比如创建m2的文件夹,在其中创建suibian.js的文件,去公开了需要公开的内容,主模块引入,就必须写为require("./m2");
必须在创建一个必须名package.json的配置文件,写入:{"main":"suibian.js"}
3、创建一个文件夹必须名为node_modules,在在其中创建创建m3的文件夹,在其中创建index.js的文件,去公开了需要公开的内容,主模块引入,就必须写为require("m3");
(2)模块的定义
概念:具有独立功能的代码段
数据库:****
数据库的使用:
1. 启动数据库服务器 在数据库使用期间不能关闭服务器端
在bin文件夹中运行cmd命令:.\mongod.exe --dbpath=数据库保存的文件的绝对路径
2. 在相同文件夹下运行客户端 前提:保证服务器端是开启的
命令:.\mongo.exe
操作数据库的命令:
1、查询所有数据库:show dbs
2、创建/切割数据库:没有就创建,有了就切换:use 数据库名称
3、查看当前选中的数据库:db
4、创建数据表:db.createCollection("表名");- 没用限制
操作数据表的命令:
1、创建数据表:db.createCollection("表名",{size:5242880,capped:true,max:5000}); - 最大存储空间为5mb,最多存储5000个,意味着这个数据表做了限制,不推荐
2、查看目前所有的数据表:db.getCollectionNames();
操作数据的命令:
1、增:db.表名.save({键值对,...}) - 一次只能插入一条数据
db.表名.save([{},{},{},{},....]) - 一次插入多条数据 d
2、删:db.表名.remove({}) - 删除数据表中所有的数据
db.表名.remove({条件}) - 条件依然也是键值对
3、改:db.表名.update({条件},{$set:{新内容}})- 条件和内容依然也是键值对
4、查:db.表名.find(); - 找所有
db.表名.find({条件}); - 条件依然也是键值对
db.表名.find({},{name:1,pwd:1}); - 找到所有的数据,但是只返回name和pwd
db.表名.find().sort({键名:1}); - 按键名升序排列!
db.表名.find({键名:{$gte:限制条件}})
db.表名.find({键名:正则}) - 甚至可以用正则(模糊查询)
db.表名.find().skip(n).limit(m) - 跳过前n条,在拿m条数据
db.表名.find().count() - 获取到此表有多少条数据
建议:根据实际要求选择相应的命令