Node.js
特点
- 属于单线程逻辑处理
- 不会产生死锁
- 适合做基于社交网络的大规模WEB应用
对比js
js运行在客户浏览器,存在多种解释器,有代码兼容性问题;Node.js运行在服务器,只有V8引擎一种解释器,不存在代码兼容性问题
两者都有相同内置对象和自定义对象,不同的宿主对象
js用于开发就浏览器端的交互效果,Node.js用于服务器端功能开发,例如数据库的访问,其他服务器得到调用
运行方式
脚本模式:node 文件的路径 回车
交互模式:node 回车 进入交互模式
退出:两次ctrl+c/ctrl+d/.exit
全局对象
global对象
(1),检测一个变量或函数是否为全局的
(2),在交互模式下属于全局作用域,里面的变量是和函数都是全局的
(3),在脚本模式下不属于全局作用域,里面的变量和函数都不是全局的,可以防止全局污染
console对象
console.log(1);//输出日志 console.info(2);//输出消息
console.warn(3);//输出警告 console.error(4);//输出错误
console.time()开始计时 console.timeEnd()结束计时
开始计时和结束计时提供的值要保持一致
process对象
进程:计算机在运行软件的时候,都会产生相应的进程
1 | process.arch 查看当前CPU的架构 |
Buffer缓冲区
1 | 缓冲区,是内存中临时存储的区域 |
定时器函数
1 | //一次性定时器: setTimeout(回调函数,时间/毫秒); |
模块
每文件是一个模块,每一个模块都是一个独立的功能
一个模块引入其他的模块
一个模块也可以被其他的模块引入
1 | require( ) //是一个函数,用于引入其他的模块 |
模块分类
1.自定义模块,第三方模块,核心模块
以路径开头 | 不以路径开头 | |
---|---|---|
文件形式 | require(‘./文件名.js’)用于引入自定义模块 | require(‘querystring’)用于引入官方提供的核心模块 |
目录形式 | require(‘./文件名’)首先会找到目录下寻找package.json文件中main对应的文件,如果找不到则会寻找index.js | require(‘tao’)首先会找到同一级目录下的node_modules目录中寻找tao,如果没找到会一直往上一级的node_modules目录中寻找;用于引入第三方模块 |
2.包和npm
CommonJS:是一种规范,制定了Node.js的模块化概念
包:通常指的是目录模块
npm:是用于管理包的工具模块
使用npm:npm init -y 生成package.json文件,作为项目文件,可以用于记录下载安装的包的信息
下载包:npm install 包的名称 ;下载安装指定的包,将包放入到node_modules目录中,如果目录不存在会先创建,同时生成package-lock.json,用于记录所有包的版本号
npm install 自动下载package.json和package-lock.json中记录的包
下载或运行其他版本文件:npx -p node@8 node 拖拽文件 下载指定版本的Node.js运行文件,运行完以后再把下载的Node.js删除
3.查询字符串模块(querystring)
查询字符串:浏览器向WEB服务器发送请求,传递的数据的一种方式,位于浏览器的地址栏中
keyword=笔记本&enc=utf-8
查询字符串模块用于操作查询字符串的工具
parse( )将查询字符串解析为对象
4.URL模块
URL:统一资源定位,互联网上的任何资源都有对应的URL
new URL( ) 将一个URL解析为对象,获取URL的各个部分
5.文件系统模块
用于操作服务器端的文件,例如文件的读取,写入,删除……
文件分为目录形式和文件形式 同步加Sync
(1)fs.statSync(文件的路径) / fs.stat(文件的路径,回调函数)
查看是否为文件形式 isFile() 返回true或false
查看是否为目录文件 isDirectory() 返回true或false
(2)创建目录 fs.mkdirSync(‘目录的路径’)
(3)移除目录 fs.rmdirSync(‘目录的路径’) //只能移除空目录
(4)读取目录 fs.readdirSync(‘../上级目录文件名’) / readdir(目录的路径,回调函数)
(5)覆盖写入文件 writeFileSync(文件的路径,数据) / writeFile(文件的路径,数据,回调函数)
如果文件不存在,则先创建文件然后写入数据
如果文件已经存在,会清空文件内容然后写入文件
(6)追加写入文件 appendFileSync(文件的路径,数据) / appendFile(文件的路径,数据,回调函数)
如果文件不存在,则先创建文件然后写入文件
如果文件已经存在,会在文件的末尾追加写入数据
(7)读取文件数据 readFileSync(文件的路径) / readFile(文件的路径,回调函数)
读取的数据结果为buffer数据格式
(8)删除文件 unlinkSync(文件的路径) / unlink(文件的路径,回调函数)
fs模块
(9)判断文件是否存在 existsSync(文件/目录) 存在–>true 不存在–>false
(10)拷贝文件 copyFileSync(源文件路径,目标文件路径) / copyFile(源文件路径,目标文件路径,回调函数)
6.*同步和异步
同步:在主程序中执行,会阻止后续代码的执行,通过返回值来获取结果
异步:在一个独立的线程执行,不会阻止主程序后续代码的执行,将结果以会低矮函数的形式放入到事件队列
文件流
1 | createReadStream() 创建可读取的文件流 |
HTTP协议
浏览器和WEB服务器之间的通信协议
(1)通信头信息
1 | Request URL:请求的服务器端的资源 |
100:接受到了请求,还没有做出响应
200:成功的响应
300:响应的重定向,跳转到另一个url
400:客户端错误
500:服务器错误
(2)响应头信息 response
1 | Content-Type:响应的内容类型 text/html; charset=UTF-8 |
(3)请求头信息 request
(4)请求主题
显示传递的数据,不是每一次都出现
HTTP模块
可以用来创建WEB服务器
(1)创建服务器
1 | 引入HTTP模块const http = require('http'); |
(2)接收请求作出相应
1 | //给服务器添加事件 |
框架
框架:是一整套解决方案,简化了已有的功能,添加了之前没有的功能
Node.js框架:express,koa,egg
1.express框架
express是基于 Node.js 平台,快速、开放、极简的 Web 开发框架
属于是第三方模块,需要先下载安装 npm install express
(1)创建WEB服务器
1 | 引入express模块 const express = require('express'); |
(2)路由
根据请求的URL和请求的方法来做出特定的响应
包含三部分:请求的URL,请求的方法,回调函数
1 | req请求对象 |
1 | res响应对象 |
数据传递的方式
名称 | 格式 | 获取 |
---|---|---|
get方式 | http://127.0.0.1:8080/mysearch?keyword=传递的值 | req.query |
post方式 | URL中不可见,在http协议的请求主体 | req.on(‘data’,(chunk)=>{chunk.toString() 需要使用查询字符串解析为对象}) |
路由传参 | http://127.0.0.1:8080/package/mysql | app.get(‘/package/:pname’,(req,res)=>{req.params}) |
(3)路由器
路由器可以统一管理路由,还额可以给一组路由器添加统一的前缀
1 | //路由器 |
WEB服务器
1 | //引入 |
中间件
拦截对服务端的请求,也可以做出响应
express下中间件分为应用级中间件,路由级中间件,内置中间件,第三方中间件,错误处理中间件
(1)应用级中间件
也成为自定义中间件,本质上就是一个函数
app.use(URL,回调函数)
app.use(回调函数)
(2)路由级中间件
app.use(拦截的url,回调函数)
(3)内置中间件
托管静态资源
客户端请求静态资源(html,css ,js,图像…)不在创建路由,让客户端自动到指定的目录下查找
app.use(express.static(‘要托管的目录’))
(4)第三方中间件
第三方中间件以第三方模块的形式出现,需要先下载安装
1 | //1.引入中间件 |
MySQL模块
Node.js下,专门用于操作MySQL数据库的第三方模块
node install mysql 下载安装
mysql命令
1 | mysql -uroot //登录数据库 |
SQL注入:在让用于提供的值中,并拼接了其他的SQL注入。
占位符( ? ):先对数据进行过滤,过滤完以后在替换占位符
1 | mysql.createConnection({ |
连接池
开始的时候创建一批的链接,可以被反复的使用,用完后会归还
1 | mysql.createPool( ) 创建连接池对象 |
RESTful接口
接口:后端为前端提供的动态资源(对数据的增删改查)
RESTful:是一种接口的设计规范
①URL
1 | 员工资源 |
②请求的方法
对资源的操作方式
1 | get 获取资源 |
③过滤数据
1 | //针对于多个资源的操作 |
1 | http://127.0.0.1:8080/v1/emps?*salary1=6000&salary2=8000* |
④返回结果
格式为json对象:字符串形式的对象,实姓名必须用双引号,属性值是字符串也得是双引号
包含状态码(人为规定),消息,数据
正则表达式
1 | test( ) 检测字符串是否符合规则 |
修饰符
1 | g - global 全局查找 i - ignore 忽略大小写 |