Nodejs經常使用模塊

1.fs模塊

概念:fs模塊是文件操做模塊,fs是 FileSystem的簡寫。它用來對文件,文件夾進行操做。javascript

// 引入模塊。
// 可使用var、let,可是建議使用const,由於咱們不但願它被改變
const fs = require('fs');
複製代碼

全部的文件操做系統都是具備同步和異步的形式:html

  • 異步的形式老是將完成回調做爲其最後一個參數,傳給完成回到的參數取決於具體的方法,可是第一個參數始終預留用於異常,若是操做成功,則第一個參數將爲null或者是undefined
const fs = require('fs');
    
    fs.unlink('/tmp/hello', (err) => {
      if (err) throw err;
      console.log('已成功刪除 /tmp/hello');
    });
複製代碼
  • 使用同步的操做發生的異常會當即拋出,可使用 try…catch 處理,也能夠容許冒泡。
const fs = require('fs');
    
    try {
      fs.unlinkSync('/tmp/hello');
      console.log('已成功刪除 /tmp/hello');
    } catch (err) {
      // 處理錯誤
    }
複製代碼
  • 使用異步的方法時沒法保證順序。 所以,如下的操做容易出錯,由於 fs.stat() 操做可能在 fs.rename() 操做以前完成:
fs.rename('/tmp/hello', '/tmp/world', (err) => {
      if (err) throw err;
      console.log('重命名完成');
    });
    fs.stat('/tmp/world', (err, stats) => {
      if (err) throw err;
      console.log(`文件屬性: ${JSON.stringify(stats)}`);
    });
複製代碼
  • 要正確地排序這些操做,則將 fs.stat() 調用移動到 fs.rename() 操做的回調中:
fs.rename('/tmp/hello', '/tmp/world', (err) => {
      if (err) throw err;
      fs.stat('/tmp/world', (err, stats) => {
        if (err) throw err;
        console.log(`文件屬性: ${JSON.stringify(stats)}`);
      });
    });

複製代碼
  • 在繁忙的進程中,強烈建議使用這些調用的異步版本。 同步的版本將阻塞整個進程,直到它們完成(中止全部鏈接)。
  • 雖然不推薦這樣使用,但大多數 fs 函數容許省略回調參數,在這種狀況下,使用一個會從新拋出錯誤的默認回調。 要獲取原始調用點的跟蹤,則設置 NODE_DEBUG 環境變量:不推薦在異步的 fs 函數上省略回調函數,由於可能致使未來拋出錯誤
$ cat script.js
    function bad() {
      require('fs').readFile('/');
    }
    bad();
    
    $ env NODE_DEBUG=fs node script.js
    fs.js:88
            throw backtrace;
            ^
    Error: EISDIR: illegal operation on a directory, read
        <stack trace.>
複製代碼

文件內容讀取-readFile

異步格式:java

fs.readFile('文件路徑'[,選項], (err, data) => {
      if (err) throw err;
      console.log(data);
    });

複製代碼

說明:node

  • 第一個參數:文件路徑。 相對路徑和絕對路徑都可。
  • 第二個參數: 配置項,可選參數。主要用來配置字符集。通常可設置爲'utf8'
  • 若是不設置該參數,文件內容會以二進制形式返回。
  • 參數3: 讀取完成後觸發的回調函數。有兩個參數 --- err 和 data
    • 讀取成功
      • err: null
      • data: 文件內容,若是不設置參數2,則返回二進制數據。可使用 toString() 方法將二進制數據 轉爲正常字符串
    • 讀取失敗
      • err: 錯誤對象
      • data: undefined
const fs = require("fs")
fs.readFile('文件路徑',"utf8", (err, data) => {
  if (err) throw err;
  console.log(data);
});
複製代碼

同步格式: 與異步格式不一樣在於:api

  • api的名字後面有Sync
  • 不是經過回調函數來獲取值,而是像一個普通的函數調用同樣,直接獲取返回值
const fs = require("fs")
    let rs = fs.readFileSync('文件路徑',"utf8");
    console.log(rs)

複製代碼

文件寫入

覆蓋寫入 writeFile瀏覽器

功能:向指定文件中寫入字符串(覆蓋寫入), 若是沒有該文件則嘗試建立該文件。它把把文件中的內容所有刪除,再填入新的內容。bash

格式:fs.writeFile(var1, var2, var3, var4);服務器

參數1: 要寫入的文件路徑 --- 相對路徑和絕對路徑都可,推薦使用絕對路徑app

參數2: 要寫入文件的字符串異步

參數3: 配置項,設置寫入的字符集,默認utf-8

參數4: 寫入完成後觸發的回調函數,有一個參數 --- err (錯誤對象)

const fs = require('fs')
fs.writeFile('./a.txt', 'hello world niahi \n asfsdf', err => {
  if (err) {
    console.info(err)
    throw err
  }
})
複製代碼

文件追加 appendFile

功能 :向指定文件中寫入字符串(追加寫入), 若是沒有該文件則嘗試建立該文件

格式:fs.appendFile(var1, var2, var3, var4);

參數1: 要寫入的文件路徑 --- 相對路徑和絕對路徑都可,推薦使用絕對路徑

參數2: 要寫入文件的字符串

參數3: 配置項,設置寫入的字符集,默認utf-8

參數4: 寫入完成後觸發的回調函數,有一個參數 --- err (錯誤對象)

const fs = require('fs')

fs.appendFile('./a.txt', '\n 爲天地立命', err => {
  if (err) {
    console.info(err)
    throw err
  }
})
複製代碼

路徑問題

在讀取文件時,寫相對路徑是容易出問題的。

  • 咱們在fs中讀取文件時,使用的是相對路徑,而相對路徑的參考點是運行這個js文件的小黑窗的路徑。而這個路徑咱們是能夠經過cd命名來調整的。

解決方法,就是在操做文件時,使用絕對路徑來定位文件。 __dirname __filename 獲取絕對路徑

絕對路徑: 從磁盤根目錄開始到指定文件的路徑。

相對路徑:是以某個文件的位置爲起點,相對於這個位置來找另外一個文件。

nodejs中提供了兩個全局變量來獲取獲取絕對路徑:

  • __dirname:獲取當前被執行的文件的文件夾所處的絕對路徑
  • __filename:獲取當前被執行的文件的絕對路徑

2.path模塊

它是一個核心模塊,用來處理路徑問題:拼接,分析,取後綴名。

  • path.basename(路徑)獲取
  • path.join()
  • path.parse(path) 轉成一個對象

3.http模塊

快速搭建服務器:

// http.js
// 引入核心模塊http
const http = require('http');

// 建立服務
const server = http.createServer(function(req, res) {
  console.log(req.connection.remoteAddress);
  res.end('hello world');
});
// 啓動服務
server.listen(8081, function() {
  console.log('success');
});

複製代碼
  • 在上面的代碼中,咱們經過http.createServer方法建立一個http服務。
// 建立服務
const server = http.createServer((req, res) => {
  console.log(req.connection.remoteAddress);
  res.end('hello world');
});

複製代碼

其中的參數是一個函數,這個函數是一個匿名函數,這個函數充當回調函數的角色,當有http請求時,它會自動被調用。

這個回調函數有它有兩個參數。這兩個參數很是重要,也很是複雜.

  • 第一個參數表示來自客戶端瀏覽器的請求,第二個參數用來設置對本次請求的響應。它們的形參名並不重要,可是,通常第一個參數名使用req或者request表示,第二個參數使用res或者resposne表示。
  • 當某個客戶端來請求這個服務器時,這個函數會自動調用,同時會自動給這兩個參數賦值。第一個參數中包括本次請求的信息。
    • req:請求
      • req.url。本次請求的地址
      • req.method。 獲取請求行中的請求方法
      • req.headers。 獲取請求頭
  • 第二個參數用來設置本服務器對此次請求的處理。
    • 這個參數通常命名是res,它是一個對象,其中有不少方法和屬性。
    • res.end()
      • 把把本次的處理結果返回給客戶端瀏覽器
      • 若是不寫這一句,則客戶端瀏覽器永遠收不到響應。
    • res.setHeader() 設置響應頭,好比設置響應體的編碼 res.setHeader('content-type', 'text/html;charset=utf-8');
    • res.statusCode 設置狀態碼

4.url模塊

做用:url模塊用來對url(例如:itcast.cn:80/schools/stu…

手冊地址:nodejs.cn/api/url.htm…

步驟:

  • 引入 const url = require('url');
  • 使用它的方法
    • obj = url.parse(地址欄中輸入的url)
let urlobj = url.parse(req.url); // urlobj對象中,就有咱們須要的信息
      urlobj.pathname :獲取用戶輸入的url的路徑名 ('/schools/students')
      urlobj.search: '?id=18&name=zs',
        urlobj.query: 獲取用戶輸入的url中的查詢字符串( 'id=18&name=zs' )
        urlobj.path: '/schools/students?id=18&name=zs',
        urlobj.href: '/schools/students?id=18&name=zs' 
複製代碼

上面urlobj.query只是得到了傳遞的所有參數,咱們通常還需從地址欄中分析傳遞的數據。即從 itcast.cn:80/schools/stu…

5.querystring模塊

用來對url中的查詢字符串這部分進行處理。nodejs中提供了querystring這個核心模塊來幫助咱們處理這個需求。

const qs= require('querystring');
let obj = qs.parse('id=18&name=zs');
console.log(obj)
複製代碼
相關文章
相關標籤/搜索