2015 年 11 月

第 30 卷,第 12 期

本文章是由機器翻譯。

工作的程式師如何成為平均: Express 路由

Ted Neward | 2015 年 11 月

Ted Neward歡迎回來,"Nodeists"。(我不曉得如果是那些使用 Node.js 上定期執行,但 Nodeists 聲音優於我"Nodeheads"或"Noderati"或"Nodeferatu。 」 的官方詞彙)

在上一篇文章中 (msdn.com/magazine/mt573719)、 應用程式的堆疊掉遭到"N"堆疊 (只要節點) 的"EN"堆疊藉由安裝 Express 來搭配 Node.js 的優點。做為關注跳直接放入其他項目一樣,有幾個有關 Express — 及其支援套件和程式庫 —,值得探索和進一步的討論內容。您先前有趨勢的其中一種,表示路由、 程式碼設定為顯示"Hello World"函式時以回應 HTTP 要求與"/"相對 URL 路徑。現在我將深入進入 Express 世界並告訴您如何更有效地使用。

順便一提,有興趣查看最新和最大寫入做為本系列的一部分的程式碼的人可以瀏覽保存此數列的程式碼 (msdn mean.azurewebsites.net) 的最新的 Microsoft Azure 站台。它是這個資料行中的資訊與在網站上,指定發行集的排程不同步和站台為讀者提供看未來有可能。

路由、 重生

概述 app.js 檔案中的最後一篇從顯示到目前為止,如所示所建置之應用程式的單一端點本質 圖 1, ,神電腦科學簡單但必要效忠。

圖 1 程式碼快速"Hello World"

// Load modules
var express = require('express');
var debug = require('debug')('app');
// Create express instance
var app = express();
// Set up a simple route
app.get('/', function (req, res) {
  debug("/ requested");
  res.send('Hello World!');
});
// Start the server
var port = process.env.PORT || 3000;
debug("We picked up",port,"for the port");
var server = app.listen(port, function () {
  var host = server.address().address;
  var port = server.address().port;
  console.log('Example app listening at http://%s:%s', host, port);
});

有問題的部分是標示為 「 設定簡單路由; 」 的程式碼區段在這裡,您正在建立的單一端點,對應的 HTTP 動詞命令 ("get") 和相對 URL 端點 ("/,"為"get"方法的第一個引數傳遞)。

很不容易推斷的其他 HTTP 動詞命令的模式 —"POST"的要求,您可以使用 post 方法。為"PUT,"放置。和 「 刪除 」、 使用 delete。Express 也支援其他動詞,但很明顯原因有的四個最在意。每個也會採用做為其第二個引數函式的範例中 圖 1 是常值處理內送 HTTP 要求的函式。

"E"的平均值

通常當 Nodeists 撰寫 Express 為基礎的應用程式,它們進行相同的方式是我們 」。NETers"撰寫 ASP.NET 應用程式。伺服器會產生 HTML 文件,包含混合資料並將該瀏覽器中,在其後使用者都會填寫表單和輸入的資料回到 Express; 文章傳回到傳送簡報 (HTML)或者,使用者按一下連結並產生 GET 回顧 Express 執行完整伺服器端循環一次。和數個工具在 Node.js 中的手寫 HTML 是因為它是以 Visual Basic 或 C# 一樣有趣,因為衍生專門用來提供相同的目的 Razor 語法沒有傳統的 ASP.NET 應用程式中的 Node.js 世界。它可讓您更輕鬆地撰寫不含混資料展示層和程式碼太多。

不過,平均值為基礎的應用程式,AngularJS 將會形成完整的用戶端經驗,因此 Express 會採用相同的角色與 ASP.NET MVC — 它是直接的傳輸層,從用戶端取得未經處理資料 (通常是在 JSON 的形式)、 根據該資料 (通常是將它儲存、 修改,或尋找相關或相關的資料) 和傳送未經處理資料 (一次通常是在 JSON 格式) 回到用戶端層。向此,我們停留在 Express 會避免樣板化架構的主體 (的有數個 Node.js 世界、"handlebars"和"jade"正在更受歡迎的兩個),以及我將著重明確只要來回傳送 JSON。部分將會呼叫這個 RESTful 端點,但坦白說,REST 包括許多不僅僅是 HTTP 和 JSON 並建置 Fielding 核准的 RESTful 系統已超出本系列的範圍。

所以現在我將討論幾個簡單的唯讀端點任何 JSON 使用用戶端應該使用的永久性。

在 JSON 中的 hello,

通常 Web API 會遵循相當鬆散的結構來取得資料:

  • 指定的資源類型 (例如 「 person 」) 的 GET 要求會產生 JSON 結果的物件,包含最小值 (適用於個別擷取) 的唯一識別碼和通常某種類型的簡短描述文字,適合顯示選項清單中每個陣列。
  • 指定資源的 GET 要求輸入的識別項 URL ("人員/1234,"其中 1234年是識別碼可唯一識別我們感興趣的人) 的一部分會產生 (通常) 是描述資源在某種程度的詳細資料中的單一 JSON 物件的 JSON 結果。

Web 應用程式開發介面也可以使用 PUT、 POST 和刪除,但現在我將著重在只擷取資料。

因此,假設資源類型 「 person 」,您將建立兩個端點,一個標示為"/ 人員、 」 和其他 「 /persons/ < 唯一識別碼 >。 」 首先,您需要一個小型的人員使用的 「 資料庫 」 — 名字、 姓氏、 以及它們目前所在的 「 狀態 」 (不論它們發生立即執行) 就夠了 (請參閱 圖 2)。

圖 2 建立人員的小型資料庫

var personData = [
  {
    "id": 1,
    "firstName": "Ted",
    "lastName": "Neward",
    "status": "MEANing"
  },
  {
    "id": 2,
    "firstName": "Brian",
    "lastName": "Randell",
    "status": "TFSing"
  }
];

SQL Server,但它會執行並非完全現在。

接下來,您需要之人員的完整集合端點:

var getAllPersons = function(req, res) {
  var response = personData;
  res.send(JSON.stringify(response));
};
app.get('/persons', getAllPersons);

請注意在此情況下,路由對應使用獨立的函式 (getAllPersons) 是較常見,因為它可協助確保分離問題更乾淨 — 函式做為 (以此模型-檢視-控制器) 控制站。現在我要將 JavaScript 物件的陣列序列化為 JSON 表示法使用 JSON.stringify 但我稍後會更簡潔的項目使用。

接下來,您的個人物件需要端點但這將需要更多執行因為您需要挑選做為參數,人員識別碼和 Express 有特定的方式完成這項作業。(可說是較簡單的方式在介面上的項目) 的一種方式是使用要求物件 (路由對應中使用的函式的 「 需求 」 參數) 的 「 參數 」 物件來擷取在路由中指定的參數但 Node.js 也可以使用參數的函式來執行更多 — 它是一種篩選會叫用時找不到特定的命名模式的參數:

app.get('/persons/:personId', getPerson);
app.param('personId', function (req, res, next, personId) {
  debug("personId found:",personId);
  var person = _.find(personData, function(it) {
    return personId == it.id;
  });
  debug("person:", person);
  req.person = person;
  next();
});

路由會叫用、 任何如下所示"/ 人員 」 (如"/ 個人/1") 將繫結至參數的名稱"personId,"就像您可能會發現使用 ASP.NET MVC。但是使用 param 函式時 — 這就會叫用時任何路由與": personId 」 會叫用 — 相關聯的函式會叫用,這將會查詢 (使用"lodash"封裝函式 [尋找] 中先前的程式碼片段所示) 從小型 personData 資料庫。然後不過,它會加入至 「 要求 」 物件 (JavaScript 物件自動動態型別,因為它是一般執行),如此就可以在此情況下會 getPerson 函式的叫用,其餘 — 因為已經擷取您想要傳回的物件就會變成小事一樁:

var getPerson = function(req, res) {
  if (req.person) {
    res.send(200, JSON.stringify(req.person));
  }
  else {
    res.send(400, { message: "Unrecognized identifier: " + identifier });
  }
};

請參閱我的 「 簡單式 」 的意思嗎?

總結

我有更多與 Express、 但是儘管滾筒上這裡,我的這個空間不足所以...祝各位寫程式!


Ted Neward是在 iTrellis,顧問服務公司的技術長。他曾撰寫 100 個以上的文章和著作或合著十多本書籍,其中包括 「 專業 F # 2.0"(Wrox 2010)。他是 F # MVP 和在世界各地研討會發表演說。他會查閱並定期 mentors — 與他連絡 ted@tedneward.comted@itrellis.com 如果您有興趣。

感謝以下技術專家對本文的審閱: Shawn Wildermuth