Node.js的概述
不是js,但是语法和js非常类似,和数据库进行交互,成为前端到数据库的一个桥梁
Node.js如何运行
- 交互模式:打开cmd输入:node回车
- 脚本/文件模式:
- 先创建xx.js,里面书写自己的代码
- 打开cmd输入:Node文件的绝对路径
Node.js知识点
- js和Node的区别
- 相同点:都可以使用一切的ECMAScript(那11个)的东西,包括一切API,都可以使用,不必担心ES5/ES6的兼容性问题
- Node没有BOM和DOM
模块(module):每一个xx.js,都可以称为一个模块
- 每一个模块都有一个操作,可以用于公开/暴露自己的成员
Node.js自带一个预定义变量:exports,可以直接使用,是一个对象
语法:- exports.属性名=值;
- module.exports.属性名=值;
- module.exports={属性名:值,....}
- 每一个模块都可以导入/引入其他模块
Node.js自带一个预定义函数:require,可以直接使用,是一个函数,放在此函数里面的路径就算允许引入的模块文件
语法:- var x=require("./路径"); ./不能省略
模块的分类
官方模块
-
Global模块:不需要引入,可以直接使用的,提供了5个预定义变量
- __filename;获取到当前文件的完整的绝对路径
- __dirname;获取到当前文件完整的相对路径
- exports;空对象,可用来公开暴露自己的成员
- require;函数,可以用于导入其他模块
- module;代指当前模块本身
-
querystring模块:解析查询字符串,使其变成一个对象,可以获取到前端传到后端的消息
- 需要引入:var qs=require("querystring");
- 作用:解析url中查询字符串部分的功能
- var obj=qs.parse("查询字符串/请求消息");
- 获取前端传来的每一个部分:obj.键名
-
url模块
- 需要引入: var url=require('url')
- 作用:解析url种各个部分的功能
- var objUrl=url.parse(str,true);支持第二个参数,是一个布尔值,默认为false,一旦设置为true,就会自动释放querystring的parse方法去解析查询字符串部分
- 路由/文件相对路径/请求地址:objUrl.pathname判断路由的不同,去读取不同的HTNL发送给用户看
- 查询字符串/请求消息:objURL.query.键名(前端form(get)传到后端的东西)
-
Buffer模块:缓冲区,可以将数据变成一个16进制的数字,可以理解为是Node.js中的一种新的数据类型,不需要引入的,可以直接使用的,但是Node.js的一些API可能会导致我们被动得到Buffer,Node.js中大部分API,都是支持Buffer,所以可以直接使用
-
fs模块 FileSystem
- 需要引入:var fs=require("fs");
- 异步读取文件:
fs.readFile(__dirname+"文件路径",(err,buf)=>{
console.log(buf);要进行任何操作都要放在函数内部,因为是一个异步函数
}) - 异步写入文件:
fs.writeFile(__dirname+"文件路径","新内容"(err)=>{
console.log(buf);要进行任何操作都要放在函数内部,因为是一个异步函数
}) - 异步追加文件:
fs.appendFile(__dirname+"文件路径","新内容"(err)=>{
console.log(buf);要进行任何操作都要放在函数内部,因为是一个异步函数
})
-
http模块:搭建服务器和文件系统
- var http=require("http");
- var url=require("url");
- var fs=require("fs");
- var app=http.createServer();
- app.listen(80);
- 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);
自定义模块
- 文件模块:创建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工具:Node Package Manager:Node.js的模块/包/软件管理器,专门用于管理第三方模块的,作用:下载、更新、删除、维护包之间的依赖关系
检查npm是否安装成功:打开cmd:npm -v 如果能看到版本号,说明安装成功
打开npm网址:www.npmjs.com
搜索你需要用到的模块,尽量用带有完全符合标签的那个包,或者是第一个包
【在你的项目中打开cmd】
下载:npm i 包名;
更新:npm up 包名;
删除:npm un 包名;
mongo
mongo的语法:都是在客户端cmd输入
- 数据库的操作
- 查询所有的数据库:show dbs
- 创建/切换数据库:没有是创建,有了就是切换:use 数据库名称
- 查看当前选中的数据库:db
- 创建数据表:db.createCollection("表名");
- 删除数据库:db.dropDatabase();
- 数据表的操作:
- 查看目前所有的数据表:db.getCollectionNames();
- 删除数据表:db.表名.drop();
- 数据的操作
- 增:db.表名.save({键值对,...})一次只能插入一条数据
db.表名.save({[键值对,...,][键值对,...]}); - 删:db.表名.remove({条件})
- 改:db.表名.update({条件},{$set:{新内容}})
- 查: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() - 获取到此表有多少条数据(做出分页条)
- 增:db.表名.save({键值对,...})一次只能插入一条数据
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,
email:String,
vip:String
})
- 增:2步
- 创建要插入的对象:var x=new User({键值对,键值对...})
- 存储到数据库:x.save().then()=>{新增完之后的操作必须放在函数内部,因为是异步函数
- 删:
- User.deleteOne/deleteMany({条件}).then(()=>{更新完之后的操作必须放在函数内部,因为是异步函数})
- 查:
-
User.find({条件}).then((rs)=>{rs为查询到的json数据}) 条件的写法和mongo的语法一样
-
Ajax
-
同步交互和异步交互
- 同步交互:用户向服务器端发起请求,直到服务器端进行响应的全过程,用户是不可以做其他事情的(等)
典型:网址提交、表单提交 - 都是属于同步交互 - 异步交互:用户向服务器端发起请求,直到服务器端进行响应的全过程,用户是可以做其他事情的(不等)
典型:Ajax请求
- 同步交互:用户向服务器端发起请求,直到服务器端进行响应的全过程,用户是不可以做其他事情的(等)
-
Ajax:Asynchronous JavaScript And XML - 异步的js和xml
-
如何使用Ajax
- 创建Ajax核心对象:var xhr=new XMLHttpRequest();
- 前端建立和服务器端的连接xhr.open("GET/POST","/路由");
- 向服务器端发送请求消息xhr.send("key=value&...");
- GET:send方法会失效,但是不可以省略,必须写为null
xhr.open("GET","/路由?key=value&...");
xhr.send(null); - POST:send方法可用 xhr.open("POST"."/路由");
- GET:send方法会失效,但是不可以省略,必须写为null
-
绑定状态监听事件
- xhr.onreadystatechange=()=>{
if(xhr.readyState==4&&xhr.status==200){
xhr.responseText;//得到后端响应的内容,难就难在这个点,你拿到了数据要干什么?}
- xhr.onreadystatechange=()=>{