node.js 小總結

node.js學習html

 1.node.js --------服務器前端

  2.node.js不會獨立開發node

  用途:jquery

  1.中間層webpack

    安全性git

    性能github

    下降主服務器的複雜度web

  2.小型服務器mongodb

  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) freeboy6716@gmail.com     //模塊做者郵箱    
Author url: (none) http://www.elmerzhang.com    //模塊做者URL    
Main module/entry point: (none) hello.js     //模塊的入口文件,咱們這裏是hello.js </span><span style="color:#ff6666;">(這個必填)</span><span style="color:#333333;">    
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 <freeboy6716@gmail.com> (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

相關文章
相關標籤/搜索