Nodejs核心模塊簡介

github文章連接:https://github.com/Vibing/blo...node

學習nodejs必需要掌握其核心,就像學JavaScript必須掌握函數、對象、數據類型、BOM、DOM等。git

nodejs核心也很多,這裏介紹幾個核心:Events模塊、fs模塊、stream的使用、http模塊。程序員

Events

事件驅動、非阻塞異步IO是nodejs的特色,因此Events是很是重要的模塊。而且node中絕大多數模塊都繼承了Eventsgithub

事件是發佈訂閱模式的實現。在瀏覽器中,好比click事件json

$('button').on('click',()=>{
    //處理click響應
})

固然你也能夠自定義事件:api

//自定義事件
$('div').bind('hello',()=>{
    alert('hello')
});

//觸發事件
$('div').trigger('hello');

那麼在 node 中如何使用 Events 模塊的呢?
咱們定義一個類,讓它繼承 Events數組

const EventEmit = require('events');

//定義一個播放器類
class Player extends EventEmit { }

const player = new Player();

//定義播放事件
player.on('play', ( param )=>{
    console.log(`播放器播放《${param}》`)
})

play.emit('play','海闊天空'); // 播放器播放《海闊天空》
play.emit('play','七里香');   // 播放器播放《七里香》

若是你想讓事件只執行一次,可使用 once :瀏覽器

//定義播放事件
player.once('play', ( param )=>{
    console.log(`播放器播放《${param}》`)
})

play.emit('play','海闊天空'); 
play.emit('play','七里香');

此時 只會打印出 播放器播放《海闊天空》服務器

上面也說了 node 中絕大多數模塊都繼承了 Events,好比 stream、fs、http等等,它們就像瀏覽器裏的 click,是原生就有的,若是你接着往下看 會對發現不少用到事件的地方。網絡

fs文件系統模塊

fs 全拼是 file system文件系統
既然是文件系統,它的主要做用就是操做文件,好比文件的新增、修改內容、讀寫文件內容等。

fs.stat 獲取文件夾及文件相關信息

查看文件夾信息

fs.stat('./logs', (err, stats) => {
  if (err) {
    console.log(err);
    return;
  }

  console.log('目錄:', stats.isDirectory());
  console.log('文件:', stats.isFile());
  console.log('大小:', stats.size);
});

//打印結果
目錄: true
文件: false
大小: 160

查看文件信息

fs.stat('./fs.js', (err, stats) => {
  if (err) {
    console.log(err);
    return;
  }

  console.log('目錄:', stats.isDirectory());
  console.log('文件:', stats.isFile());
  console.log('大小:', stats.size);
});

//打印結果
目錄: false
文件: true
大小: 2087

fs.mkdir 建立文件夾

// 建立目錄
fs.mkdir("./logs", err => {
  if (err) {
    console.log(err);
    return;
  }
  console.log("logs目錄建立成功");
});

fs.mkdir 是異步方法,若是你想同步建立可使用 fs.mkdirSync

fs.mkdirSync('./logs2'); //同步建立文件夾

fs.writeFile 寫入內容

fs.writeFile('./logs2/hello.log', '你好~', err => {
  if (err) {
    console.log(err);
    return;
  }
  console.log('寫入成功');
});

注意: 若文件不存在則建立文件 若文件中有內容則覆蓋

有時候咱們不但願內容被覆蓋,而是追加,那麼可使用 appendFile 方法。

fs.appendFile("./logs/hello.log", "hello~\n我是程序員", err => {
  if (err) {
    console.log(err);
    return;
  }
  console.log("寫入成功");
});

fs.readFile 讀取文件內容

// 讀取文件內容
fs.readFile("./logs/hello.log", "utf8", (err, stats) => {
  if (err) {
    console.log(err);
    return;
  }
  console.log(stats);
});

fs.readdir 讀取文件夾

// 讀取文件夾
fs.readdir("./logs", (err, files) => {
  if (err) {
    console.log(err);
    return;
  }
  console.log(files); //返回一個包含全部文件名稱的數組
});

//打印結果
[ 'data-write.json', 'data.json', 'traking.log' ]

fs.rename 修改文件名稱

// 修更名稱 把hello.log修改成tranking.log
fs.rename("./logs/hello.log", "./logs/traking.log", err => {
  if (err) {
    console.log(err);
    return;
  }

  console.log("更名成功");
});

刪除目錄下全部文件

// 刪除目錄下文件
fs.readdirSync("./logs").map(file => {
  // 刪除文件unlink
  fs.unlink(`./logs/${file}`, err => {
    if (err) {
      console.log(err);
      return;
    }
    console.log("文件刪除成功");
  });
});

刪除文件夾

// 只能刪除空目錄 若目錄裏不爲空則會報錯 因此要先刪除裏面的文件 再刪除文件夾
fs.rmdir("./logs", err => {
  if (err) {
    console.log(err);
    return;
  }
  console.log("目錄刪除成功");
});

Stream 流

流,可理解爲水流。只不過這裏是數據流。
流的意義在於三點:

  1. 有源頭
  2. 有終點
  3. 從源頭流到終點

使用 stream 讀寫文件

const fs = require('fs');

const fileReadStream = fs.createReadStream('./logs/data.json');
const fileWriteStream = fs.createWriteStream('./logs/data-write.json');


/* 經過文件流的事件方式 */
fileReadStream.on('data', chunk => {
  fileWriteStream.write(chunk); // 可寫流寫入文件 若是文件不存在則建立文件
});

fileReadStream.on('error', err => {
  console.log('錯誤:', err);
});

fileReadStream.on('end', () => {
  console.log('結束');
});

上面代碼中創建了一個流:可讀流--->可寫流。它知足了上面說的三點:有源頭(可讀流)、有終點(可寫流)、從源頭到終點(一個文件裏的數據流到了另外一個文件裏)。

代碼中也能看出,Stream 其實也繼承了 Events,它含有data、error、end等事件。

使用 pipe

咱們把上面代碼改一下

// 監聽pipe事件
fileWriteStream.on('pipe', source => {
  console.log(source);
});

/* 經過pipe方式 */
fileReadStream.pipe(fileWriteStream);

pipe 可理解爲水管,在可讀流和可寫流之間鏈接了水管,不須要再監聽 data 事件,使用起來很方便 能達到一樣的效果。

Http 模塊

http 模塊主要用於搭建 http 服務,處理用戶請求信息等

使用 http 請求

const http = require('http');

// 使用發送http請求
const options = {
  protocol: 'http:',
  hostname: 'www.baidu.com',
  port: '80',
  method: 'GET',
  path: '/img/baidu_85beaf5496f291521eb75ba38eacbd87.svg'
};

let responseData = '';

const request = http.request(options, response => {
  console.log(response.statusCode); // 獲取連接請求的狀態碼

  response.setEncoding('utf8');

  response.on('data', chunk => {
    responseData += chunk;
  });

  response.on('end', () => {
    console.log(responseData);
  });
});

request.on('error', error => {
  console.log(error);
});

request.end();

使用 http 建立服務

// 使用http建立服務器
const port = 3000;
const host = '127.0.0.1';

const server = http.createServer();

server.on('request', (request, response) => {
  response.writeHead(200, {
    'Content-Type': 'text/plain'
  });
  response.end('Hello World\n');
});

server.listen(port, host, () => {
  console.log(`Server running at http://${host}:${port}/`);
});

關於 Node 核心模塊還有不少,好比 Buffer、crypto加密、global全局變量、net網絡、os操做系統等等,只不過上面介紹的是使用頻率很是高的模塊。

後面文章會繼續介紹,詳情的api使用請參考官網

相關文章
相關標籤/搜索