Files

3.0 KiB
Raw Permalink Blame History

id, title, challengeType, forumTopicId, dashedName
id title challengeType forumTopicId dashedName
587d7fb1367417b2b2512bf3 實現一個根級的請求記錄中間件 2 301514 implement-a-root-level-request-logger-middleware

--description--

前面我們介紹了 express.static() 中間件函數, 現在是時候更詳細地瞭解什麼是中間件了。 中間件函數是一個接收 3 個參數的函數,這 3 個參數分別是:請求對象、響應對象和在應用的請求-響應循環中的下一個函數。 中間件函數執行一些可能對應用程序產生一些效果的代碼,通常還會在請求對象或者響應對象裏添加一些信息, 它們也可以在滿足某些條件時通過發送響應來結束循環, 如果在它們完成時沒有發送響應,那麼就會開始執行堆棧中的下一個函數, next() 將觸發調用第 3 個參數。

請看以下示例:

function(req, res, next) {
  console.log("I'm a middleware...");
  next();
}

假設在某個路由上安裝了這個中間件函數, 當一個請求與路由匹配時它會顯示字符串“Im a middleware…”然後它執行堆棧中的下一個函數。 在這個練習中,我們將構建根級中間件。 正如我們在挑戰 4 中看到的,要在根層級安裝中間件函數,我們可以使用 app.use(<mware-function>) 方法。 在這種情況下,該函數將對所有請求執行,但也可以設置更具體的條件來執行, 例如,如果你希望某個函數只針對 POST 請求執行,可以使用 app.post(<mware-function>) 方法。 所有的 HTTP 動詞GET、DELETE、PUT……都存在類似的方法。

--instructions--

構建一個簡單的日誌記錄器。 對於每個請求,它應該在控制檯中打印一個採用以下格式的字符串:method path - ip 例如:GET /json - ::ffff:127.0.0.1。 注意 methodpath 之間有一個空格,並且 pathip 中間的破折號的兩邊都有空格。 可以使用 req.methodreq.pathreq.ip 從請求對象中分別獲取請求方法http 動詞)、路由相對路徑和請求者的 ip 信息。 當你完成時,記得要調用 next(),否則服務器將一直處於掛起狀態。 請確保“Logs”是打開的觀察一下當一些請求到達時會發生什麼事情。

注意: Express 按照函數在代碼中出現的順序來執行, 中間件也是如此。 如果你想讓中間件函數適用於所有路由,那麼應該在路由之前配置好中間件。

--hints--

應該激活根級記錄器中間件

(getUserInput) =>
  $.get(getUserInput('url') + '/_api/root-middleware-logger').then(
    (data) => {
      assert.isTrue(
        data.passed,
        'root-level logger is not working as expected'
      );
    },
    (xhr) => {
      throw new Error(xhr.responseText);
    }
  );

--solutions--

/**
  Backend challenges don't need solutions, 
  because they would need to be tested against a full working project. 
  Please check our contributing guidelines to learn more.
*/