1. 程式人生 > 實用技巧 >面試題總結(node面試題)

面試題總結(node面試題)

附上鍊接https://zhuanlan.zhihu.com/p/102442557

1、node有哪些特徵,與其他伺服器端對比

  特徵:單執行緒、事件驅動、非阻塞I/O

  node 無法直接渲染靜態頁面,提供靜態服務

  node 沒有根目錄的概念

  node 必須通過路由程式指定檔案才能渲染檔案

  node 比其他服務端效能更好,速度更快

2、CommonJS中require/exports和ES6中import/export區別

  CommonJS模組的重要特性是載入時執行,及指令碼程式碼在require的時候,就會全部執行。一旦出現某個模組被“迴圈載入”就只輸出已經執行的部分,還沒有執行的部分是不輸出的

  ES6模組是動態引用,如果使用import從一個模組載入變數,那些變數不會快取,而是成為一個指向被載入模組的引用,impor/export最終都是編譯為require/exports來執行的

4、使用npm有哪些好處?

  通過NPM,你可以安裝和管理專案的依賴,並且能夠指明依賴項的具體版本號,可以通過package.json檔案來管理專案資訊,配置指令碼

5、AMD CMD規範的區別

  CommonJS和AMD都是JavaScript模組化規範

  CMD依賴就近,而AMD依賴前置

  CMD是延遲執行的,而AMD是提前執行的

  AMD的API預設是一個當多個用,CMD的API嚴格區分,推崇職責單一

6、如何判斷當前指令碼執行在瀏覽器還是node環境中

  通過判斷 Global 物件是否為 window ,如果不為window ,當前指令碼沒有執行在瀏覽器中

7、簡述同步和非同步的區別,如何避免回撥地獄

  同步方法呼叫一旦開始,呼叫者必須等到方法呼叫返回後,才能繼續後續的行為

  非同步方法呼叫一旦開始,方法呼叫就會立即返回,呼叫者就可以繼續後續的操作。而非同步方法通常會在另外一個執行緒中,整個過程,不會阻礙呼叫者的工作

  避免回撥地獄:

  1)Promise

  2)async/await

  3)generator

  4)事件釋出/監聽模式

  

8、幾種常見模組化規範的簡介

   CommonJS規範主要用於服務端程式設計,載入模組是同步的,這並不適合在瀏覽器環境,因為同步意味著阻塞載入,瀏覽器資源是非同步載入的

  AMD規範在瀏覽器環境中非同步載入模組,而且可以並行載入多個模組。不過,AMD規範開發成本高,程式碼的閱讀和書寫比較困難

  CMD規範與AMD規範很相似,都用於瀏覽器程式設計,依賴就近,延遲執行,可以很容易在Node.js中執行(依賴SPM 打包,模組的載入邏輯偏重)

  ES6 在語言標準的層面上,實現了模組功能,而且實現得相當簡單,完全可以取代 CommonJS 和 AMD 規範,成為瀏覽器和伺服器通用的模組解決方案

9、app.use和app.get區別

  app.use(path,callback)中的callback既可以是router(路由)物件又可以是函式

  app.get(path,callback)中的callback只能是函式

10、說一下事件迴圈eventloop

  1)所有同步任務都在主執行緒上執行,形成一個執行棧

  2)當主執行緒中的執行棧為空時,檢查事件佇列是否為空,如果為空,則繼續檢查;如不為空,則執行3

  3)取出任務佇列的首部,加入執行棧

  4)執行任務

  5)檢查執行棧,如果執行棧為空,則跳回第 2 步;如不為空,則繼續檢查

11、node怎麼跟MongoDB建立連線

  1)引入mongoose

  2)使用mongoose.connect()方法連線到MongoDB資料庫

  3)監聽連線是否成功

  4)然後通過node,書寫介面,對資料庫進行增刪改查

12、node 和 前端專案怎麼解決跨域的

   通過在node伺服器端設定

複製程式碼
//解決跨域問題
app.use(async(ctx, next) => {

        //指定伺服器端允許進行跨域資源訪問的來源域。可以用萬用字元*表示允許任何域的JavaScript訪問資源,但是在響應一個攜帶身份資訊(Credential)的HTTP請求時,必需指定具體的域,不能用萬用字元
        ctx.set("Access-Control-Allow-Origin", "*");

        //可選。它的值是一個布林值,表示是否允許客戶端跨域請求時攜帶身份資訊(Cookie或者HTTP認證資訊)。預設情況下,Cookie不包括在CORS請求之中。當設定成允許請求攜帶cookie時,需要保證"Access-Control-Allow-Origin"是伺服器有的域名,而不能是"*";如果沒有設定這個值,瀏覽器會忽略此次響應。
        ctx.set("Access-Control-Allow-Credentials", true);
        
        //指定伺服器允許進行跨域資源訪問的請求方法列表,一般用在響應預檢請求上
        ctx.set("Access-Control-Allow-Methods", "OPTIONS, GET, PUT, POST, DELETE");
        
        //必需。指定伺服器允許進行跨域資源訪問的請求頭列表,一般用在響應預檢請求上
        ctx.set("Access-Control-Allow-Headers", "x-requested-with, accept, origin, content-type");
        // ctx.set("X-Powered-By", ' 3.2.1');
        
        //告訴客戶端返回資料的MIME的型別,這只是一個標識資訊,並不是真正的資料檔案的一部分
        ctx.set("Content-Type", "application/json;charset=utf-8");
        
        //如果不設定mode,直接設定content-type為application/json,則fetch會預設這是跨域模式(mode:'cors'),在跨域POST之前,客戶端會先發一條OPTIONS請求來”探探路”,如果伺服器允許,再繼續POST資料。對於這種OPTIONS請求,需要在伺服器配置允許接受OPTIONS請求,這樣寫就是直接允許了所有的OPTIONS請求,也可以按照需求來判斷OPTIONS請求中更詳細的資訊
        if (ctx.request.method == "OPTIONS") {
            ctx.response.status = 200
        }
        await next();
    });