Nodejs入門思想

以下是講解nodejs的方向列表
一、Nodejs特點
二、Nodejs模塊化
三、Nodejs異步回調
四、Nodejs爬蟲
五、Nodejs中間件

一、Nodejs特點

  1. Node是單線程_不需要爲每一個客戶端連接創建新線程,當有用戶連接了,就觸發一個內部事件,通過非阻塞IO,讓Nodejs程序宏觀上並行
  2. 非阻塞I/O:Nodejs通過回調函數(Callback)異步機制
  3. 異步、事件驅動模型,不管是新用戶請求,還是老用戶的IO完成,都將以事件方式加入事件環,等待調度
    Nodejs適用於高併發,I/O密集,少量業務邏輯的場景

Nodejs中所有的IO都是異步的,回調函數,套回調函數。(與Java基礎的形式有所不同,需要轉換思想,Java本身是有什麼返回值,然後方法調用的時候可以接受返回值)

二、Nodejs模塊化

Nodejs大方向包含三種模塊:內置模塊、第三方模塊、自定義模塊(一個js文件一個模塊)
內置模塊:比方nodejs的path,就屬於一個模塊,使用方法:var path=require(‘path’);
第三方模塊:一般採用npm i “需要的模塊”,是需要下載依賴的模塊的,下載之後,引入方法同上;
自定義模塊:自己寫的js並且拋出模塊,下面是代碼:

module.js

let name={
    sayHello(){
        console.log('你好');
    }
}

module.exports=name

tets.js

let moduleTest=require('./module.js');
moduleTest.sayHello();

結果就是:打印出你好

三、Nodejs異步回調

Nodejs全部採用異步回調的形式
大量的異步操作,如果需要順序執行,通過回調函數執行,但是這樣會多層嵌套,導致回調地獄
可以通過promise解決回調地獄
假設需求,有1.txt 2.txt 3.txt三個文件,需要你順序讀取內容,並且將信息打印,當然,如果是Java基本寫的方式實現,只需要封裝一個函數,然後順序調用即可。但是在nodejs中行不通,謹記,nodejs是異步的。
如果想順序執行,最基礎的方式如下,在回調函數中調用另一個的形式完成需求:

var fs=require('fs');
//第一個
fs.readFile('./1.txt',function(err,data){
    if(err){
        throw err;
    }
    console.log(data);
    //第二個
    fs.readFile('./2.txt',function (err,data) { 
        if(err){
            throw err;
        }
        console.log(data);
        //第三個
        fs.readFile('./3.txt',function (err,data) {
            if(err){
                throw err;
            }
            console.log(data);
          })
     })
})

以上的方式實現就是典型的地獄回調,nodejs可以使用promise的方式組織地獄回調,代碼如下:

var fs=require('fs');
function getFileDataByPath(filePath) {
    return new Promise(function (resolve,reject) {
        fs.readFile(filePath,function (err,data) {
            if(err){
                //失敗,要執行失敗的回調
                reject(err);
            }else{
                //成功的邏輯
                resolve(data);
            }
          })
      })
  }

  getFileDataByPath('./1.txt').then(function (data) {
      console.log(data);
      return getFileDataByPath('./2.txt');
    })//通過getFileDataByPath返回的是一個promise對象,可以繼續.then串聯調用(鏈式調用)
    .then(function (data) {
        console.log(data);
        return getFileDataByPath('./3.txt');
      }).then(function (data) { 
          console.log(data);
       }).catch(function (err) {
           //catch作用:上面所有的promise如果其中有1個錯誤,則終止下面所有的promise執行,直接進入catch捕獲對應的異常錯誤信息
           console.log(err);
         }).finally(function () {
             //無論成功或失敗都會執行
             console.log('完成');
           })

ps:promise語法:
new promise(function(resolve,reject){…})
promise對象是一個代理對象(代理一個值),被代理的值在promise對象創建時可能是未知的。它允許你爲異步操作的成功和失敗分別綁定相應的處理方法。這讓異步方法可以像同步方法那樣返回值,但並不是立即返回最終執行結果,而是一個能代表未來出現的結果的promise對象
參考鏈接如下:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise

四、Nodejs爬蟲

爬蟲會拉取網站的請求並且獲取有效信息
1、獲取目標網站 http.get
2、分析網站內容,可以採用第三方模塊cheerio,需要npm下載模塊,相當於是jQuery中的選擇器
cheerio.load()將一組HTML格式的字符串,轉換爲類DOM,之後可以通過jQuery的語法選中其中的元素
3、獲取有效信息,下載或者其他操作

五、Nodejs中間件

中間件 middleewear
分類:內置中間件 static,自定義中間件(全局,局部),第三方中間件body-parser攔截器
中間件使用一定要注意next
場景:需要攔截所有的請求並且判斷是否有token,沒有token的話則返回缺少token,有的話則繼續後續代碼的執行

var express=require('express');
const app=express();

app.use('/',function (req,res,next) {
    console.log('中間件');
    let {token} =req.query
    if(token){
        next()
    }else{
        res.send('缺少token');
    }
  })

ps:如果在有token的時候,沒有進行next(),那麼整個的就執行不下去了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章