node.js 小总结

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);
url 使用

 

      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

 

 

 

    

 

转载于:https://www.cnblogs.com/BR-Tao/p/11164996.html

你可能感兴趣的:(前端,网络,json,ViewUI)