15

后端知识点总结——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();

  1. Node.js 原生模块—QueryString

 querystring模块用于处理HTTP请求URL中查询字符串
 var obj = qs.parse(str);   把查询字符串解析js对象
 var str = qs.stringify(obj) 把js对象转换为查询字符串
 
  1. Node.js 原生模块—URL

url模块用于解析一个HTTP请求地址,获取其中各个部分
var obj = url.parse(str); 把一个URL地址为js对象
var obj = url.parse(str,true); 功能同上,并且把其中查询字符串转换

                      js obj
  1. 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){})
                    函数:文件追加结束

  1. 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 ->mysqlRedis

      微博/微信    微博[点赞]   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


楷楷
4k 声望10.5k 粉丝

兴趣是最好的老师!