以下是講解nodejs的方向列表
一、Nodejs特點
二、Nodejs模塊化
三、Nodejs異步回調
四、Nodejs爬蟲
五、Nodejs中間件
一、Nodejs特點
- Node是單線程_不需要爲每一個客戶端連接創建新線程,當有用戶連接了,就觸發一個內部事件,通過非阻塞IO,讓Nodejs程序宏觀上並行
- 非阻塞I/O:Nodejs通過回調函數(Callback)和異步機制
- 異步、事件驅動模型,不管是新用戶請求,還是老用戶的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(),那麼整個的就執行不下去了