node.js学习
1.node.js --------服务器
2.node.js不会独立开发
用途:
1.中间层
安全性
性能
降低主服务器的复杂度
2.小型服务器
3.工具
node.js 优势
1.便于前端入手
2.性能高
3.利于和前端代码整合
nodejs引入包
const multer = require( ' multer' );
node.js里面的两个核心包是 http 和 fs
关于错误处理:
错误处理:同步: try catch 异步:错误的回调优先
npm安装包前使用 npm init初始化
$ npm init Package name: (hello) //模块名字,npm init会自动取当前目录名作为默认名字,这里不需要改,直接确认即可 Description: A example for write a module //模块说明 Package version: (0.0.0) 0.0.1 //模块版本号,这个大家按自己习惯来定就可以 Project homepage: (none) //模块的主页,如果有的话可以填在这里,也可以不填 Project git repository: (none) //模块的git仓库,选填。npm的用户一般都使用github做为自己的git仓库 Author name: Elmer Zhang //模块作者名字 Author email: (none) [email protected] //模块作者邮箱 Author url: (none) http://www.elmerzhang.com //模块作者URL Main module/entry point: (none) hello.js //模块的入口文件,我们这里是hello.js (这个必填) Test command: (none) //测试脚本,选填 What versions of node does it run on? (~v0.5.7) * //依赖的node版本号,我们这个脚本可以运行在任何版本的node上,因此填 * About to write to /home/elmer/hello/package.json // 以下是生成的package.json文件内容预览 { "author": "Elmer Zhang(http://www.elmerzhang.com)", "name": "hello", "description": "A example for write a module", "version": "0.0.1", "repository": { "url": "" }, "main": "hello.js", "engines": { "node": "*" }, "dependencies": {}, "devDependencies": {} } Is this ok? (yes) //对以上内容确认无误后,就可以直接回车确认了
关于npm的全局安装和局部安装
全局安装:
全局安装往往是安装一个工具,他不是安装在一个文件夹下,而是安装在某个全局环境下(比如 babel webpack)
全局安装了的babel和webpack,可以看到在根目录下都有cmd后缀的文件,通过这些文件,我们就可以直接在命令行中使用了。
如使用 babel --version、 babel-doctor --version等等都是有效的,且不管你是在哪个目录文件下运行的。
局部安装:
局部安装并不是这样,往往是在一个项目中安装之后装入 ./node_nodules 下面, 然后在项目中,我们可以使用 require 等方式引入。
这样的局限在于,只能是在本项目中使用,而webpack和babel这样的工具可以在各种情况、各种项目中使用。
安装npm 包的快捷键
1.模块安装
【npm install xxx】利用 npm 安装xxx模块到当前命令行所在目录;
【npm install -g xxx】利用npm安装全局模块xxx;
2.本地安装
【npm install xxx】安装但不写入package.json;
【npm install xxx --save】 安装并写入package.json的"dependencies"中; 【npm install xxx --s】
【npm install xxx --save-dev】安装并写入package.json的"devDependencies"中。【npm install xxx -d】
3.模块删除
【npm uninstall xxx】删除xxx模块;
【npm uninstall -g xxx】删除全局模块xxx;
模块引用
从当前的modules文件夹开始往上查找
####爬虫小案例: (可以使用crawler模块)
1.获取目标网站 http.get
2.分析网站内容 cheerio (模块可以将一组html字符串转化成类dom 可以用jquery选择器的语法选取内容)
3.获取有效信息 下载或者其他操作
服务器:
1.响应请求
2.数据交互
3.数据库
--------------------------------------------------------------------------------
数据交互
http介绍
http报文结构 (header : <= 32k ; body : <= 2g )
状态码:
1xx 信息
2xx 成功 (200)
3xx 重定向
4xx 请求错误 (404)
5xx 服务器错误
请求方式
GET 获取
数据放在url里传输(放在请求头里)
容量小
POST 发送数据
容量大
数据放在body里面
-------------------------------------------------------------------------
接收浏览器的get请求
**可以用 url 模块
url.parse(req.url , true) =>{
......
pathname,query
}
GET => "/aaa/b?xx=xxx&xxx=xx"
**还可以用 querystring 模块来实现
querystring.parse( query ); // query是切割好的字符串
-------------------------------------------------------------------------
接收浏览器的post请求
接受浏览器的post数据-----body
分为几次接受
const http = require('http'); // 导入http库 const querystring = require('querystring'); // 导入querystring库 let server = http.createServer((req,res)=>{ let arr = []; req.on('data',buffer=>{ arr.push(buffer); }); req.on('end',()=>{ // 所有数据传输完毕后执行 let buffer=Buffer.concat(arr); //传送结束后再拼接在一起 let post = querystring.parse(buffer.toString()); // tostring是为了便于我们查看,实际开发不用 console.log(post); }); }); //服务器监听(防止程序结束) server.listen(8080);
POST => "XX=XXXX&XXX=XX"
模块系统:分为 系统模块 和 第三方模块
node.js 模块系统:
1.定义模块
module exports require
2.系统包
1.assert --断言
assert(条件,msg) //普通的判断
assert.deepEqual(变量,预期值,msg) //相当于 ==
assert.deepstrictEqual(变量,预期值,msg) //相当于 ===
2.path ---网址
str = root / a / b / 1.txt
path.dirname(str ); //文件路径名 root / a / b
path.extname( str); // 文件类型名 .TXT
path.basename( str); //文件名 abc.TXT
path.resolve( ); //转化为绝对路径输出
3.querystring --- 请求数据
parse() js=>字符串
stringify() 字符串 =》 js
4.url ---- 网址
url.parse( )可以解url的内容
url.format( ) 可以将对象转成url对象
const url = require('url'); //将url字符串转成对象 // let string = 'https:47.95.207.1:3000/fcj/recommend/hot/hehe?us=123&ps=567#nihao'; // let str = url.parse(string); // console.log(str); //将对象转回字符串 let str = { protocol: 'https:', slashes: null, auth: null, host: null, port: null, hostname: null, hash: '#nihao', search: '?us=123&ps=567', query: 'us=123&ps=567', pathname: '47.95.207.1:3000/fcj/recommend/hot/hehe', path: '47.95.207.1:3000/fcj/recommend/hot/hehe?us=123&ps=567', href: 'https:47.95.207.1:3000/fcj/recommend/hot/hehe?us=123&ps=567#nihao' } let string = url.format(str); console.log(string);
5.net(***网络通信模块***)
简单介绍OSI参考模型
物理层 > 数据链路层 > 网络层(IP)> 会话层 > 表现层 > 应用层(HTTP)
互联网里(5层协议)
物理层 > 数据链路层 > 网络层(IP)> 应用层(HTTP)
net 在传输层
关于post请求的传输格式( 例:<分隔符>\r\n字段信息\r\n \r\n内容\r\n\r\n <分隔符>\r\n字段头\r\n\r\n内容\r\n<分隔符>\r\n字段头\r\n\r\n内容\r\n<分隔符> - -)
1.用分隔符来切分
[ null,
" \r\n字段信息\r\n\r\n内容\r\n",
" \r\n字段信息\r\n\r\n内容\r\n",
'- -', ]
2.将第0个与最后一个去掉
3.对每一项使用\r\n\r\n 切割得到字段信息和内容
*fetch *jsonp * formdata **websocket**(自带跨域)
----------------------------------------------------------------------------------------
fetch-----原生,xhr改良版
1.读取
2.解析
-----------------------------------------------------------------------------------------
jsonp (安全性低,早期用于解决跨域问题)
1.原理
2.jquery
======================================================
webSocket:
1.性能高
2.双向
socket.io
1,简单、方便
2,兼容 IE5
3,自动数据解析
express模块
###服务器相关
服务器:1,服务器是一台电脑 2,服务器软件(apach tomcat iis ngnix node) 3.服务器ip 和 端口号(80)
局域网:服务器通过网线(无线连接) 每个电脑都会有一个ip
外网:
ip:确定服务器主机的位置
port(端口):确定服务器里的某个程序
### api接口的书写
接受数据
-- get req.query
-- post req.body 需要body-parser 插件进行解析
注意数据格式 json x-www-form-urencode formdata
###中间件 middlewear
内置中间件 static
自定义中间件 (全局和局部)
第三方中间件 (body - parser)
在合适的地方执行next
###静态资源目录 static (类似apache的www)
### 非关系数据库(文档) mongodb
1.下载
2.安装
处理异步的常用方式
promise asyc/awiat (es7)
promise //解决异步回调处理
封装的promise函数有两个参数(reslove,reject)并且会执行两个外部函数then和catch
执行reslove表示成功,外部会走then()函数;;执行reject表示失败,外部会走catch()函数
封装好promise后可以进行链式调用,只需要一个catch()
####自制一个简单的登陆模块##################
1.注册登陆 mongod
2.验证码逻辑接口实现
a.验证用户名存在
b.获取验证码
1.获取邮箱验证接口 :发送邮件 ; 邮箱和验证码保存在内存中、
2.5分钟之内,不能重复发送(利用时间戳来计算时间)
3.apidoc 自动生前api接口文档
全局安装 apidoc 模块
实现socket的方式
1.net
2.socket.io 麻烦 兼容性最好
3.websocket h5新增 低版本浏览器不兼容 使用简单
======================
前端后端 都要创建服务器连接
1.搭建socket 服务器 后:new WebSocket.server({prot:8080},()=>{ })
ws.onOpen( ) //开启监听
2.前端进行连接 前: new WebSocket(' ws://localsocket:8080' );
ws.onOpen( ) //前端开启连接
=======================
数据交互
client.on( ' message ', ( )=>{ } ) //有数据传递到服务器端就触发 (都是被动监听接受数据)
3.前端主动发送数据
4.后端主动发送数据
ws.onmessage = ( )=>{ } //有数据传递到前端就触发 (都是被动监听接受数据)
//主动发送都是使用 ws.send( )
=======================
前后端断开的处理
后: ws.on('close') ;
前: ws.onClose( ) ;
5.断开连接
什么时候用长连接
1.实时刷新(轮询)
2.服务端发起数据
#### 身份验证
http请求 无状态
1.登陆时候 发布一个加密字符串 (用户相关信息) 给前端
2.调用其他接口 加密字符串 作为参数传递给服务器
3.根据权限进行验证
session+cookie
cookie-parse
express-session
jwt