認識 Express 的 res.send() 和 res.end()

程式設計三昧發表於2022-01-21

認識 Express 的 res.send() 和 res.end()

前言

在使用 Node.js 的服務端程式碼中,如果使用的是 Express 框架,那麼對於一個請求,常常會有兩種響應方式:

// 方法1
app.get("/end", (req, res, next) =>{
    res.end(xxx);
});
// 方法2
app.get("/send", (req, res, next) =>{
    res.send(xxx);
});

那麼這兩種方式究竟有何區別?各自的應用場景分別是什麼?這是我今天需要講清楚的。

Express 之 res.end()

定義

它可以在不需要任何資料的情況下快速結束響應。

這個方法實際上來自 Node 核心,具體來說是 http.ServerResponse.Useresponse.end() 方法:

image-20220121021236372

語法

res.end([data[, encoding]][, callback])

引數解析:

  • data <string> | <Buffer>
  • encoding <string>
  • callback <Function>

深入

如果給 res.end() 方法傳入一個物件,會發生報錯:

image-20220121012102733

Express 之 res.send()

定義

向請求客戶端傳送 HTTP 響應訊息。

語法

res.send([body[,statusCode]])

body 引數可以是 Buffer、Object、String、Boolean 或 Array。

深入

通過程式碼除錯,我們可以發現,Express 的 res.send() 方法最終呼叫的也是 http.ServerResponse.Useresponse.end() 方法:

// node_modules/express/lib/response.js
res.send = function send(body) {
  var chunk = body;
  var encoding;
  ……
  if (req.method === 'HEAD') {
    // skip body for HEAD
    this.end();
  } else {
    // respond
    this.end(chunk, encoding);
  }
  return this;
};

對比

相同點

Express 的 res.end() 和 res.send() 方法的相同點:

  1. 二者最終都是迴歸到 http.ServerResponse.Useresponse.end() 方法。
  2. 二者都會結束當前響應流程。

不同點

Express 的 res.end() 和 res.send() 方法的不同點:

  1. 前者只能傳送 string 或者 Buffer 型別,後者可以傳送任何型別資料。
  2. 從語義來看,前者更適合沒有任何響應資料的場景,而後者更適合於存在響應資料的場景。

總結

Express 的 res.end() 和 res.send() 方法使用上,一般建議使用 res.send()方法即可,這樣就不需要關心響應資料的格式,因為 Express 內部對資料進行了處理。

~

~本文完,感謝閱讀!

~

學習有趣的知識,結識有趣的朋友,塑造有趣的靈魂!

大家好,我是〖程式設計三昧〗的作者 隱逸王,我的公眾號是『程式設計三昧』,歡迎關注,希望大家多多指教!

你來,懷揣期望,我有墨香相迎! 你歸,無論得失,唯以餘韻相贈!

知識與技能並重,內力和外功兼修,理論和實踐兩手都要抓、兩手都要硬!

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章