• Node.js Video Tutorials

Node.js - 面試問題



親愛的讀者,這些Node.JS 面試問題是專門為了讓您熟悉在面試Node.JS主題時可能遇到的問題型別而設計的。根據我的經驗,優秀的面試官在面試過程中很少會計劃要問什麼具體問題,通常問題會從該主題的一些基本概念開始,然後根據進一步的討論和您的回答繼續下去。

Node.js 是一個基於 Google Chrome 的 JavaScript 引擎(V8 引擎)構建的 Web 應用程式框架。

Node.js 帶有執行時環境,在此環境中可以解釋和執行基於 JavaScript 的指令碼(類似於 JAVA 位元組碼的 JVM)。此執行時允許在瀏覽器外部的任何機器上執行 JavaScript 程式碼。由於 Node.js 的此執行時,JavaScript 現在也可以在伺服器上執行。

Node.js 還提供了一個豐富的各種 JavaScript 模組庫,這在很大程度上簡化了使用 Node.js 開發 Web 應用程式的過程。

Node.js = 執行時環境 + JavaScript 庫

Node.js 庫的所有 API 都是非同步的,即非阻塞的。從本質上講,這意味著基於 Node.js 的伺服器永遠不會等待 API 返回資料。伺服器在呼叫下一個 API 後會繼續執行,而 Node.js 的事件通知機制則幫助伺服器獲取先前 API 呼叫的響應。

以下是使用 Node.js 的主要好處

  • 非同步和事件驅動Node.js 庫的所有 API 都是非同步的,即非阻塞的。從本質上講,這意味著基於 Node.js 的伺服器永遠不會等待 API 返回資料。伺服器在呼叫下一個 API 後會繼續執行,而 Node.js 的事件通知機制則幫助伺服器獲取先前 API 呼叫的響應。

  • 非常快由於構建在 Google Chrome 的 V8 JavaScript 引擎之上,Node.js 庫在程式碼執行方面非常快。

  • 單執行緒但高度可擴充套件 - Node.js 使用帶有事件迴圈的單執行緒模型。事件機制幫助伺服器以非阻塞方式響應,並使伺服器具有高度可擴充套件性,這與建立有限執行緒來處理請求的傳統伺服器相反。Node.js 使用單執行緒程式,並且同一個程式可以為比 Apache HTTP 伺服器等傳統伺服器多得多的請求提供服務。

  • 無緩衝 - Node.js 應用程式從不緩衝任何資料。這些應用程式只是分塊輸出資料。

是的!Node.js 是在 MIT 許可證 下發布的,並且可以免費使用。

是的!Node 使用帶有事件迴圈的單執行緒模型。

REPL 代表 Read Eval Print Loop,它表示一個類似於視窗控制檯或 unix/linux shell 的計算機環境,使用者可以在其中輸入命令,系統會以輸出進行響應。Node.js 或 Node 自帶 REPL 環境。它執行以下所需任務。

  • 讀取 - 讀取使用者輸入,將輸入解析為 JavaScript 資料結構並存儲在記憶體中。

  • 評估 - 獲取並評估資料結構

  • 列印 - 列印結果

  • 迴圈 - 迴圈執行上述命令,直到使用者連續按兩次 ctrl-c。

是的。

使用變數儲存值並在以後列印。如果未使用 var 關鍵字,則將值儲存在變數中並列印。而如果使用 var 關鍵字,則會儲存值但不會列印。您以後可以使用這兩個變數。

使用_獲取最後的結果。

C:\Nodejs_WorkSpace>node
> var x = 10
undefined
> var y = 20
undefined
> x + y
30
> var sum = _
undefined
> console.log(sum)
30
undefined
>

npm 代表 Node Package Manager。npm 提供以下兩個主要功能

  • Node.js 包/模組的線上儲存庫,可在 search.nodejs.org 上搜索。

  • 命令列實用程式,用於安裝包、執行版本管理和 Node.js 包的依賴項管理。

全域性安裝的包/依賴項儲存在<使用者目錄>/npm 目錄中。此類依賴項可用於任何 Node.js 的 CLI(命令列介面)功能,但不能直接在 Node 應用程式中使用 require() 匯入。要全域性安裝 Node 專案,請使用 -g 標誌。

C:\Nodejs_WorkSpace>npm install express -g

預設情況下,npm 會以本地模式安裝任何依賴項。這裡的本地模式是指將包安裝在 Node 應用程式所在的資料夾中的 node_modules 目錄中。本地部署的包可以透過 require() 訪問。要本地安裝 Node 專案,語法如下。

C:\Nodejs_WorkSpace>npm install express

使用以下命令 -

C:\Nodejs_WorkSpace>npm ls -g

package.json 位於任何 Node 應用程式/模組的根目錄中,用於定義包的屬性。

以下是 Package.json 的屬性

  • name - 包的名稱

  • version - 包的版本

  • description - 包的描述

  • homepage - 包的主頁

  • author - 包的作者

  • contributors - 包的貢獻者姓名

  • dependencies - 依賴項列表。npm 會自動安裝此處在包的 node_module 資料夾中提到的所有依賴項。

  • repository - 包的儲存庫型別和 URL

  • main - 包的入口點

  • keywords - 關鍵字

使用以下命令解除安裝模組。

C:\Nodejs_WorkSpace>npm uninstall dependency-name

更新 package.json 並更改要更新的依賴項的版本,然後執行以下命令。

C:\Nodejs_WorkSpace>npm update

回撥函式是函式的非同步等效項。在完成給定任務後會呼叫回撥函式。Node 大量使用了回撥函式。所有 Node 的 API 都是以支援回撥函式的方式編寫的。例如,讀取檔案的函式可能會開始讀取檔案並立即將控制權返回給執行環境,以便可以執行下一條指令。檔案 I/O 完成後,它將呼叫回撥函式,同時將檔案的內容作為引數傳遞給回撥函式。因此,沒有阻塞或等待檔案 I/O。這使得 Node.js 具有高度可擴充套件性,因為它可以處理大量請求而無需等待任何函式返回結果。

如果應用程式必須等待某些 I/O 操作才能完成其進一步執行,則負責等待的程式碼稱為阻塞程式碼。

透過提供回撥函式。每當觸發相應的事件時,都會呼叫回撥函式。

Node js 是一個單執行緒應用程式,但它透過事件和回撥函式的概念支援併發。由於 Node js 的每個 API 都是非同步的,並且是一個單執行緒,因此它使用非同步函式呼叫來維護併發。Node 使用觀察者模式。Node 執行緒保持一個事件迴圈,每當任何任務完成時,它都會觸發相應的事件,該事件會向事件監聽器函式發出執行訊號。

EventEmitter 類位於events模組中。可以透過以下語法訪問它 -

//import events module
var events = require('events');

//create an eventEmitter object
var eventEmitter = new events.EventEmitter();

當 EventEmitter 例項遇到任何錯誤時,它會發出“error”事件。新增新監聽器時,會觸發“newListener”事件,而刪除監聽器時,會觸發“removeListener”事件。

EventEmitter 提供了多個屬性,如onemiton屬性用於將函式繫結到事件,而emit用於觸發事件。

Buffer 類是一個全域性類,可以在應用程式中訪問而無需匯入 buffer 模組。Buffer 是一種整數陣列,對應於 V8 堆之外的原始記憶體分配。Buffer 不能調整大小。

管道是一種將一個流的輸出連線到另一個流的機制。它通常用於從一個流獲取資料並將該流的輸出傳遞到另一個流。管道操作沒有限制。考慮上面的示例,我們使用 readerStream 讀取 test.txt,並使用 writerStream 寫入 test1.txt。現在,我們將使用管道來簡化讀取一個檔案並寫入另一個檔案的操作。

fs 模組用於基於檔案的操作。

var fs = require("fs")

buffer 模組用於基於緩衝區的操作。

var buffer = require("buffer")

http 模組用於基於 Web 的操作。

var http = require("http")

正確。

fs 模組中的每個方法都有同步和非同步形式。非同步方法將最後一個引數作為完成函式回撥,回撥函式的第一個引數是錯誤。建議使用非同步方法而不是同步方法,因為前者永遠不會阻塞程式執行,而後者會阻塞。

讀寫操作的標誌如下:

  • r - 開啟檔案以進行讀取。如果檔案不存在,則會引發異常。

  • r+ - 開啟檔案以進行讀寫。如果檔案不存在,則會引發異常。

  • rs - 以同步模式開啟檔案進行讀取。指示作業系統繞過本地檔案系統快取。這主要用於開啟 NFS 掛載上的檔案,因為它允許您跳過可能過時的本地快取。這對 I/O 效能有非常真實的影響,因此除非您需要,否則不要使用此標誌。請注意,這不會將 fs.open() 變成同步阻塞呼叫。如果這就是您想要的,那麼您應該使用 fs.openSync()

  • rs+ - 開啟檔案以進行讀寫,並告訴作業系統以同步方式開啟它。有關謹慎使用此選項,請參閱“rs”的說明。

  • w - 開啟檔案以進行寫入。如果檔案不存在,則建立檔案;如果檔案存在,則截斷檔案。

  • wx - 類似於“w”,但如果路徑存在則失敗。

  • w+ - 開啟檔案以進行讀寫。如果檔案不存在,則建立檔案;如果檔案存在,則截斷檔案。

  • wx+ - 類似於“w+”,但如果路徑存在則失敗。

  • a - 開啟檔案以進行追加。如果檔案不存在,則建立檔案。

  • ax - 類似於“a”,但如果路徑存在則失敗。

  • a+ - 開啟檔案以進行讀取和追加。如果檔案不存在,則建立檔案。

  • ax+ - 類似於“a+”,但如果路徑存在則失敗。

流是物件,允許您以連續的方式從源讀取資料或向目標寫入資料。

在 Node.js 中,有四種類型的流。

  • Readable - 用於讀取操作的流。

  • Writable - 用於寫入操作的流。

  • Duplex - 可用於讀寫操作的流。

  • Transform - 一種雙向流,其中輸出基於輸入計算。

每種型別的流都是 EventEmitter 例項,並在不同時間例項中丟擲多個事件。例如,一些常用的事件是:

  • data - 當有資料可供讀取時觸發此事件。

  • end - 當沒有更多資料可供讀取時觸發此事件。

  • error - 當接收或寫入資料時發生任何錯誤時觸發此事件。

  • finish - 當所有資料都已重新整理到底層系統時觸發此事件。

鏈式呼叫是一種機制,用於將一個流的輸出連線到另一個流,並建立多個流操作的鏈。它通常與管道操作一起使用。

以下是非同步模式下開啟檔案的函式語法:

fs.open(path, flags[, mode], callback)

引數

以下是使用引數的說明:

  • path - 這是一個包含路徑的檔名字串。

  • flags - 標誌指示要開啟的檔案的行為。下面列出了所有可能的值。

  • mode - 這設定檔案模式(許可權和粘滯位),但僅當檔案被建立時才設定。預設為 0666,可讀和可寫。

  • callback - 這是回撥函式,它獲取兩個引數 (err, fd)。

以下是讀取檔案方法之一的語法:

fs.read(fd, buffer, offset, length, position, callback)

此方法將使用檔案描述符讀取檔案,如果您想直接使用檔名讀取檔案,則應使用另一種可用方法。

引數

以下是使用引數的說明:

  • fd - 這是由檔案 fs.open() 方法返回的檔案描述符。

  • buffer - 這是將資料寫入其中的緩衝區。

  • offset - 這是緩衝區中開始寫入的位置的偏移量。

  • length - 這是一個整數,指定要讀取的位元組數。

  • position - 這是一個整數,指定從檔案的哪個位置開始讀取。如果 position 為 null,則將從當前檔案位置讀取資料。

  • callback - 這是回撥函式,它獲取三個引數 (err, bytesRead, buffer)。

以下是寫入檔案方法之一的語法:

fs.writeFile(filename, data[, options], callback)

如果檔案已存在,此方法將覆蓋該檔案。如果您想寫入現有檔案,則應使用另一種可用方法。

引數

以下是使用引數的說明:

  • path - 這是一個包含路徑的檔名字串。

  • data - 這是要寫入檔案的字串或緩衝區。

  • options - 第三個引數是一個物件,它將儲存 {encoding, mode, flag}。預設編碼為 utf8,模式為八進位制值 0666,標誌為“w”。

  • callback - 這是回撥函式,它獲取單個引數 err,並在發生任何寫入錯誤時用於返回錯誤。

以下是關閉開啟檔案的方法之一的語法:

fs.close(fd, callback)

引數

以下是使用引數的說明:

  • fd - 這是由檔案 fs.open() 方法返回的檔案描述符。

  • callback - 這是回撥函式,它不獲取任何引數,除了可能給完成回撥傳遞的異常之外。

以下是獲取有關檔案資訊的方法的語法:

fs.stat(path, callback)

引數

以下是使用引數的說明:

  • path - 這是一個包含路徑的檔名字串。

  • callback - 這是回撥函式,它獲取兩個引數 (err, stats),其中 stats 是 fs.Stats 型別的物件,在下面的示例中列印。

以下是截斷開啟檔案的方法的語法:

fs.ftruncate(fd, len, callback)

引數

以下是使用引數的說明:

  • fd - 這是由檔案 fs.open() 方法返回的檔案描述符。

  • len - 這是檔案截斷後的長度。

  • callback - 這是回撥函式,它不獲取任何引數,除了可能給完成回撥傳遞的異常之外。

以下是刪除檔案的方法的語法:

fs.unlink(path, callback)

引數

以下是使用引數的說明:

  • path - 這是包含路徑的檔名。

  • callback - 這是回撥函式,它不獲取任何引數,除了可能給完成回撥傳遞的異常之外。

以下是建立目錄的方法的語法:

fs.mkdir(path[, mode], callback)

引數

以下是使用引數的說明:

  • path - 這是包含路徑的目錄名。

  • mode - 這是要設定的目錄許可權。預設為 0777。

  • callback - 這是回撥函式,它不獲取任何引數,除了可能給完成回撥傳遞的異常之外。

以下是刪除目錄的方法的語法:

fs.rmdir(path, callback)

引數

以下是使用引數的說明:

  • path - 這是包含路徑的目錄名。

  • callback - 這是回撥函式,它不獲取任何引數,除了可能給完成回撥傳遞的異常之外。

以下是讀取目錄的方法的語法:

fs.readdir(path, callback)

引數

以下是使用引數的說明:

  • path - 這是包含路徑的目錄名。

  • callback - 這是回撥函式,它獲取兩個引數 (err, files),其中 files 是目錄中檔名的陣列,不包括“.”和“..”。

__filename 表示正在執行的程式碼的檔名。這是此程式碼檔案的已解析絕對路徑。對於主程式,這並不一定與命令列中使用的檔名相同。模組內的值是該模組檔案的路徑。

__dirname 表示當前正在執行的指令碼所在的目錄的名稱。

setTimeout(cb, ms) 全域性函式用於在至少 ms 毫秒後執行回撥 cb。實際延遲取決於外部因素,如作業系統計時器粒度和系統負載。計時器不能超過 24.8 天。

此函式返回一個不透明值,表示可以用來清除計時器的計時器。

clearTimeout( t ) 全域性函式用於停止之前使用 setTimeout() 建立的計時器。這裡 t 是 setTimeout() 函式返回的計時器。

setInterval(cb, ms) 全域性函式用於在至少 ms 毫秒後重復執行回撥 cb。實際延遲取決於外部因素,如作業系統計時器粒度和系統負載。計時器不能超過 24.8 天。

此函式返回一個不透明值,表示可以用來使用 clearInterval(t) 函式清除計時器的計時器。

console 物件用於用於在 stdout 和 stderr 上列印資訊。

process 物件用於獲取有關當前程序的資訊。提供與程序活動相關的多個事件。

接下來是什麼?

接下來,您可以回顧一下您之前完成的與該主題相關的作業,並確保您能夠自信地談論它們。如果您是應屆畢業生,面試官不會期望您回答非常複雜的問題,而是您必須使自己的基礎概念非常牢固。

其次,如果您無法回答一些問題,其實並不重要,重要的是無論您回答了什麼,都必須充滿自信地回答。所以在面試時要保持自信。我們在 tutorialspoint 祝您面試順利,並祝您未來的事業一切順利。乾杯 :-)

廣告