后端知识点总结——NODE.JS基础
1.Node.js
Node.js不是JS,是一种软件开发平台,它的竞争对象JSP/PHP/ASP.NET,历史第一次有一种语言可以通吃前后端.
网站:阿里云镜像
https://npm.taobao.org/mirrors/node/
版本:0.12(16年初) 4.x(16年中) 6.x(16年底)
LTS:Long Term Support
Current:最新版本
JSP = HTML+JAVA 功能强大可靠,适合大型企业级项目
PHP = HTML+PHP 简单易用,适合互联网项目
ASP.NET = HTML+C# 易用,适合windows 平台
30w==2w+0.5w+20w+10w
Node.JS = HTML+”JS” 性能好,适合服务器端IO密集型项目,
不适合CPU密集型项目
CPU密集项目:滴滴打车,天气预报,大数据分析,大数据计算..
IO密集项目:查询,修改,删除,
2.Node运行的两种方式
(1)交互模块—简单了解(测试新功能)
REPL:输入一行代码执行一行
注意:交互模自带输出功能,不必一定要 console.log()
node 回车 进入交互模式
.exit 退出
(2)脚本模块—正式项目中使用
把要执行所有语句编写一个文本文件中(后缀任意,没有),一次性提交node解析器执行.
node 完整路径/x.js 回车
提交:只要安装成node.js,重启webstorm,ws可以自动发现node.exe解析,
新的项目和文件编写一定UTF-8
3.nodejs中特有概念—模块—(重点)
一个项目中多个”模块”,订单模块,用户模块,支付模块….
node.js按照功能,可以把函数,对象分别保存不同文件或目录下,
这些目录和文件在node.js称为一个“模块”
04_node.js 05.js
##注意:Node.JS每个一个模块都是一个独立构造函数,
Node.JS解析器自动为每一个.js文件添加如下代码.
(function(exports,require,module,__filename,__dirname){
exports:{} 用于声明向外部导出自己成员
require:fn 用于导入其它的模块,并且创建指定模块对象
module: 当前模块对象
__filename
__dirname
var i = 10;
var j = 11;
console.log(i+j);
});
4.Node.js 模块中exports和module.exports对象区别是什么?
二者都可以用于向外导出自己内部成员,
但:实际向外导出成员 module.exports
exports 对应一个引用
每个模块都可以使用自己require();引入另一个模块—底层本质是创建指定模块一个对象实例.
08_data.js 声明二个变量一个函数 ->导出一个变量一个函数
09_app.js 引入
5.nodejs 模块-目录模块
自定义模块的两种形式
(1)文件模块
创建一个JS文件,如m3.js,导出其公开数据,
其它模块可以require("./m3");引入
(2)目录模块
方式一:创建一个目录,假设m4,其中创建index.js文件,导
出需要公开数据。其它模块引入
var m = require(“./m4”);
方式二:创建一个目录,假设m5,其中创建5.js文件,导出需要
公开数据数据,创建package.json文件 main指定启动
文件 5.js 其它模块引入
var m = require(“./m5”);
方式三:创建一个目录,必须名为 node_modules
,其中再创建目录模块,假设 m6 其中创建 package.json
文件,其中声明 main属性指定默认执行启动js,如6.js,
其中导出需要公共数据,其它模块引入
require(“m6”);
文件模块 目录模块(方式三)
程序结构 m1.js node_modules
m2
package.json
2.js
模块名称 m1 m2
导出数据 module.exports module.exports
导入模块 var m = require(“./m1”); var m = require(“m2”);
6.Node.js 解析引擎自带 原生模块—Buffer(缓冲区)
Buffer:缓冲区,本质上是一块内存区域,用于暂存以后要用到数据
(数字,字符串,二进制图片/音频/视频),该区域称为“缓存”
分配置一个指定大小缓冲区 1024字节
建议:缓冲区大小不超过 512KB 512*1024
var buff1 = Buffer.alloc(1024);
使用一个数组创建缓冲区
var buff2 = Buffer.from([1,2,3]);
使用一个字符串创建缓冲区
var buff4 = Buffer.from(“abc”);
将一个缓冲区内容转换字符串{如果缓冲区数据是字符串}
var str = buff4.toString();
- Node.js 原生模块—QueryString
querystring模块用于处理HTTP请求URL中查询字符串
var obj = qs.parse(str); 把查询字符串解析js对象
var str = qs.stringify(obj) 把js对象转换为查询字符串
- Node.js 原生模块—URL
url模块用于解析一个HTTP请求地址,获取其中各个部分
var obj = url.parse(str); 把一个URL地址为js对象
var obj = url.parse(str,true); 功能同上,并且把其中查询字符串转换
js obj
- Node.js 原生模块—fs—(重点)
文件:在node.js 我们系统文件或者目录统称为文件
fs 模块提供对文件和目录进行,增删改查,读定文件内容
(1) 同步读写文件(阻塞)
同步读取文件内容 var data = fs.readFileSync(fileName);
同步向文件写内容 fs.writeFileSync(fileName,data);
注意:(1)如果当前写入文件并不存在,自动创建一个
a.txt
(2)如果当前写入目录并不存在,报错
d:/abc/a.txt
(3)如果当前文件己经存在内容,清空
同步向文件追加内容
fs.appendFileSync(fileName,data);
(2) 异步读写文件(非阻塞)
异步读取数据 fs.readFile(fileName,function(err,data){ });
函数:文件读取完成后调用
err:读取文件不存在,权限不足,
自动创建错误对象
#异步写数据 fs.writeFile(fileName,data,function(err){})
函数:文件写结束调用
#异步追加数据 fs.appendFile(fileName,data,function(err){})
函数:文件追加结束
- Node.js 原生模块–http
HTTP 模块可用于编写基于HTTP协议客户端程序(即浏览器),也可以编写一个基于HTTP协议服务器(APACHE)
APACHE[1000并发量] nginx[28000] IIS[微软]
用http模块编写一个web服务器
(1)创建服务器对象 var server = http.createServer();
(2)绑定监听端口 1-65535 server.listen(3000);
(3)接收客户端请求, server.on(“request”,(req,res)=>{..})
(4)并且响应客户消息 res.end(str...);
req:请求对象:保存客户端请求消息
req.url 请求url地址
res:响应对象:服务器发送数据客户端,修改响应格式
三个常用对象:
(1) server 代表服务器对象
(2) req (request)请求对象,保存客户端很多信息
req.url 客户请求地址
req.method 客户请求方式
req.httpVersion HTTP版本
req.headers 请求头
(3) res (response)响应对象,保存服务器端向客户发送数据
res.statusCode = 200;
res.setHeader(); 设置响应头
res.write(); 向客户端输入响应消息主体
res.end(); 通知客户端,响应消息结束(只能一次)
常见错误:程序端口被占用
listen EADDRINUSE :::3000
解决:查找前面程序停止即可
11.node.js 第三方模块 (mysql/express)
使用node.js访问mysql服务器
为了精简NODE.JS解析器,官方没有提供访问任何数据库相关模块,
必须使用工具 npm 下载第三方模块,在www.npmjs.org 搜索关键字
Mysql 可以得到相关模块,每个模块使用说明.
示例:下载
npm install mysql 简写 npm i mysql
mysql模块使用步骤
(1)复制模块 node_modules day03根目录下
(2)加载mysql模块 const mysql = require(“mysql”);
(3)创建到数据库服务器连接
var conn = mysql.createConnection({})
(4)发送sql语句并且获取服务器返回结果
conn.query(sql,(err,result)=>{});
(5)关闭连接 conn.end();
12.nodejs第三方模块express (重点)
下载express 模块
npm i express http高级模块
npm i body-parser 处理post请求
npm i cookie-parser 处理cookie
npm i express-session 处理session
npm i cors 跨域
express模块
使用官方提供HTTP模块可以创建一个web服务器应用,但此模块
非常底层,要处理各种情形,比较繁琐。推荐使用HTTP高层模块,
express—第三方模块,是一个基于node.js http模块的高层模块,简化
服务器端开发。
(1) 下载模块 npm i express
(2) 将模块内容复制项目中 day04/node_modules
(3) 加载相应模块 http/express
(4) 创建express对象,再创建服务器对象,并且绑定监听端口
var app = express();
var server = http.createServer(app);
server.listen(3000);
常规语法规则:
app.get(请求地址,回调函数);
接收客户请求 GET /index.html
app.get(“/index.html”,(req,res)=>{});
接收客户请求 POST /index.html
app.post(“/index.html”,(req,res)=>{});
示例:
以前:login.php 参数 数据库 json
$.get(“login.php”,…..);
现在:app.get(“/login.do”,(req,res)=>{
参数 数据库 json
});
$.get(“/login.do”…..);
13.express req和res对象
res.sendFile(__dirname+文件绝对路径); =fs.read+res.write+res.end
res.send(向客户端返回html字符串响应);
res.json(obj); =setHead()+JSON.parse()+res.write()+res.end()
express GET 请求 接收参数二种方法
#GET /login.do?uid=10&uname=tom
app.get(“/login.do”,(req,res)=>{
//express为每一个req对象添加属性query
req.query.uid;
req.query.uname;
});
GET /login.do/12/tom
app.get(“/login.do/:uid/:uname”,(req,res)=>{
//express 为每个req对象添加一个params 属性
req.params.uid
req.params.uname
});
14.为了项目提高效率创建连接池
(1)创建连接池
var pool = mysql.createPool({…}); host;user;password;
connectionLimit:5 连接池中活动连接5个
建议范围:5~25
1亿(PV/1day)= 8小时=28800秒=10-100=34/s
100000000/28800/100=
(2)所有应用程序 租连接
pool.getConnection((err,conn)=>{
});
(3)归还连接 conn.release();
15.请求方式:HTTP协议
请求方法:用于标识此次请求的目的
GET 表示客户端想”获得”指定资源
POST 表示客户端想”上传/添加”指定数据给服务器,
请求数据在请求主体中
PUT 表示客户端想”放置”数据在服务器
DELETE 表示客户端想”删除”服务器上指定资源
16.发送请求
浏览器发送GET请求
地址栏输入url回车/表单GET/AJAX GET/超链接/js跳转/img src
浏览器发送POST请求
表单POST/AJAX POST
浏览器发送DELETE请求
AJAX-DELETE
浏览器发送PUT请求
AJAX-PUT
项目:{跨域}
两台web服务器 {nodejs 服务器业务功能}
{apaceh 服务器接收请求响应html静态资源}
一台数据库服务器 {数据 mysql服务器}
扩展思路与知识储备
注意事项:
如果客户端跨域请求服务器资源为了保存session工作正确
需要在ajax请求添加属性
xhrFields:{withCredentials:true}
17.项目瓶颈:数据库
原理:数据库中数据保存在磁盘上的某一组文件
解决一:提供SQL查询效率
SELECT uid,uname,age FROM xz_user;
数据库对象:索引 提高查询效率[select];
降低更新效率[update/delete/insert]
什么项目用:索引 查询多更新少
索引为什么快:工作原理
美团快递:送餐{死心眼} 数据库默认工作方式
美团快递:送餐{机灵}
ALTER TABLE xz_user ADD INDEX (uname)
SELECT uid FROM xz_user WHERE uname = “tom”;
400w-没有加索引之前 查询一条记录 2s
400w->加索引之后 查询一条记录 0.00002s
解决二:主从数据库服务器{一个服务器负责写数据<主>}
{多个从服务器负责读数据<从>}
解决三:内存级数据库服务器{NOSQL} 极高数据读写 Redis
数据库读写速度太高->数据库压力太大{出问题} cpu 100%
社区:php/mysql 在线人数 t_online 2 服务器down
$phpcount = 1; ->redis ++ -- 效率很好
tts:学生登录 8:45~9:30 ->mysqlRedis
微博/微信 微博[点赞] 120 Redis
(2)提高项目{PV Page View} 高性能服务器/页面静态化
Nginx/
(3)安全角度
SQL 注入 node.js ?
XSS 攻击 脚本 oa[报销/申请办公用品/审批] [确认]
document.all.readonly = true
过滤用户所有输入值/所有危险字符串判断
DDOS 攻击 向某个网站发送大量垃圾 防火墙
解决:网店->天猫->阿里云 6G/s
(4)数据分析数据挖掘(大数据/人工智能)
18.中间件-(路由级中间件)
1.Express 是一个自身功能极简,完全是中间件构成web框架
从本质上讲一个express应用就是由中间件组成系统.
2.中间件(Middleware)是一个函数,它可以访问请求对象和响应对象
(req request,res response),可以控制请求-响应流程,有一个参数
next变量 下一个中间件
3.中间件功能包括
执行任何代码
修改请求和响应对象
终结请求-响应循环 [拦载器]
调用下一个中间件
4.中间件分类
应用级中间件(*)
路由级中间件(*)
错误处理中间件
内置中间件
5.标准语法
app.use(url,(req,res,next)=>{
});
url:拦载地址(触发地址)
req:请求对象
res:响应对象
next:调用下一个中间件或路由
6.路由中间件
路由 = 请求方法+请求地址+处理函数
示例: app.get(“/list”,(req,res)=>{…})
语法
var router = express.Router(); //创建路由中间件对象
router.get(“/find”,(req,res)=>{});
router.post(“/list”,(req,res)=>{});
module.exports = router;
app.use(“/user”,router);
http://127.0.0.1:3000/user/find
http://127.0.0.1:3000/user/list
(1)创建三个路由文件
router/userRouter.js 保存所有用户功能
router/orderRouter.js 保存所有订单功能
router/productRouter.js 保存所有产品功能
app.js
var userRouter = require(“./router/userRouter”);
var orderRouter = require(“./router/orderRouter”);
var productRouter = require(“./router/productRouter”);
app.use(“/user”,userRouter);
app.use(“/order”, orderRouter);
app.use(“/product”, productRouter);
http://127.0.0.1:3000/user/list
http://127.0.0.1:3000/order/list