2015 年 12 月

第 30 卷,第 13 期

本文章是由機器翻譯。

工作的程式師如何成為平均: Express 輸入

Ted Neward | 2015 年 12 月

Ted Neward歡迎回來,「 Nodeists 」。(我已建立,為的客戶定期使用 Node.js endearment 半官方詞彙。如果您不在意它,卸除電子郵件或有更好的建議推文,要記住我其他兩個的想法是 「 Noderati 」 或 「 Nodeferatu 」。)

在前一篇文章中,應用程式已成長到 Web API 端點,以取得的人員 (我資源這個應用程式集合的形式包含一些輸出的功能,我似乎建置人員資料庫某種) 或個別人員透過任意 「 識別碼 」 指定為 URL 的一部分。該是時候開始處理輸入 — 可進入系統,將新的個人從系統移除使用者,並更新現有的人員。在某些方面,這些是 「 僅 」 新的 URL 端點,應用程式,但有一些新技巧,我要討論過程。

我提到最後一次,會想看看最新的且最大為本系列的一部分,可以瀏覽 Microsoft Azure 站台所撰寫的程式碼的人,其中保存此數列的程式碼 (msdn mean.azurewebsites.net) 的最新。很可能與在網站上,指定發行集的排程,在這裡不同步,但如果有任何項目,站台會預先的功能,讓讀者 tech 何謂排在下一步。

說到最後一個資料行,截至一篇中,程式碼可以顯示現有的人在資料庫中,但它們不修改恕不另行通知還。因為這通常是任何線上系統不可或缺的一部分,現在加"CUD""R"CRUD 來完成。

另一個了灰塵...

最簡單的其中一個實作首先是"D"CRUD 中: 刪除。設定路由 Express 中只需要使用程式碼刪除而不是 get 使用上一次:

app.delete('/persons/:personId', deletePerson);

回想一下我的上一篇專欄,「: personId 」 是參數,則可以使用 Express 」 req 」 (要求) 中的物件相關聯的函式 (deletePerson),且由挑選 personId 中介軟體函式也說明了過去的時間,因此,您可以知道哪些人從系統移除。

說到 deletePerson,實作是相當簡單,使用 lodash 移除記憶體中資料庫中搜尋,並移除所述的個別方法 (請參閱 圖 1)。

圖 1 使用 Lodash Remove 方法

var deletePerson = function(req, res) {
  if (req.person) {
    debug("Removing", req.person.firstName, req.person.lastName);
    _.remove(personData, function(it) {
      it.id === req.person.id;
    });
    debug("personData=", personData);
    var response = { message: "Deleted successfully" };
    res.status(200).jsonp(response);
  }
  else {
    var response = { message: "Unrecognized person identifier"};
    res.status(404).jsonp(response);
  }
};

PersonId 中介軟體將會挑選: personId (不論其值)、 在資料庫中尋找適當的人員物件和放置,為傳入的要求 (「 要求 」) 物件的人員屬性,因此如果沒有 req.person,表示沒有人透過該識別碼找不到資料庫中。當您傳送回應時,不過,而不是從先前的文章,透過內建的 JSON.stringify 方法轉換結果為 JSON 使用 jsonp 的方法,將資料轉換成 JSON 格式,或使其更加精確,JSONP (填補 JSON) 格式,被廣泛地視為是傳送 JSON 回瀏覽器的上層 (且更安全) 的方式。請注意方法呼叫 「 鏈結 」。這表示您可以使用任一 200 傳回 JSON 回應的訊息已成功,刪除該人員或 404 訊息無法辨識該人員的識別碼所組成的 fluent 一行程式碼。

進入我的資料庫

接下來,您可能應該支援將人到資料庫。同樣地,這是相當直接了當的路由: 依照慣例,Web API 倡導者,建議使用的資源集合 URL 的 POST (/ 人員),以便插入資料庫,因此這麼做:

app.post('/persons', insertPerson);

不特別令人雀躍。但是新 wrinkle 會形成: 若要插入系統的人員,你要挑出連入要求的個人資料的 JSON。方法之一就是擷取整個要求主體使用 req.body 參數,但您再由與 JSON 剖析成適用於儲存物件的麻煩 (和稍微危險) 的工作。相反地,這其中 Node.js 社群依賴其廣泛集合的程式庫,而當然是很好處理程式庫有,稱為內文剖析器。安裝 (「 npm 安裝內文-剖析器 」 package.json 相同目錄中),然後加以參考,並告訴它使用的 Express 應用程式物件:

// Load modules
  var express = require('express'),
  bodyParser = require('body-parser'),
  debug = require('debug')('app'),
  _ = require("lodash");
// Create express instance
var app = express();
app.use(bodyParser.json());

回想一下,討論稍早大約: personId,關於如何快速可讓您建立中介軟體函式,以無訊息模式做為管線的一部分執行一些工作嗎? 這正是本文剖析器程式庫的功能 — 它安裝多項 「 攔截 」 (posture 更好的詞彙) 來處理各種形式出現在要求的主體。在這裡,您會問它剖析 JSON,但也可以支援 URL 編碼,剖析為大型字串時 (使它更容易剖析 CSV,例如),所有項目或 「 原始 」 的所有項目抓取 Node.js 緩衝區 (大概是因為內送資料是某種形式的二進位檔案)。因為大部分的什麼我們關心在意現在使用 JSON 來處理,只使用該已足夠。

InsertPerson 函式,則實際上真的 anticlimactic:

var insertPerson = function(req, res) {
  var person = req.body;
  debug("Received", person);
  person.id = personData.length + 1;
  personData.push(person);
  res.status(200).jsonp(person);
};

(好了,唯一識別碼產生程式碼無法使用許多工作,但請記住的目標是最後使用 MongoDB,我們不會浪費大量時間擔心的。)

傳回從 insertPerson,當程式碼會傳回完整 Person 物件剛插入,包括其新的 id 欄位;這不是完全標準的慣例,但在我自己的程式碼中我覺得這很有幫助。如此一來用戶端並知道任何其他驗證/更正/伺服器-側邊-寶石的送出的實體,例如 [id] 欄位在此情況下。

如何張貼三個呢?

順便一提,其中一個有趣的部分,這種方式 (相對於傳統的 Web 應用程式中) 建置 Web API 的相關是部分進行應急的測試最簡單的技巧,就無法使用。例如,您要如何快速測試 insertPerson 函式的運作? 為了安全起見,還有無數的自動化測試 node.js,支援和,即將在未來的專欄中,但現在是最容易使用其中一個瀏覽器外掛程式 (例如 Chrome Postman) 或者,忠的命令列風扇捲曲免費軟體公用程式來預先安裝在 OS X 和大部分的 Linux 映像。如果您不喜歡那些之一,是有一些其他,所有的自動縮放整個範圍的複雜度,從臨機操作來自動化,包括一個我的最愛 Runscope (runscope.com),可自動化測試的 API 端點,項目執行 24x7 雲端為基礎的系統。

不論您使用,如果您不喜歡,快速移動,因為實際上有數以千計的方式。

與芳鄰保持最新狀態

最後,應用程式必須支援更新已經在資料庫中的人員在許多方面,這是組合的複雜度 (在資料庫中尋找正確的對象) 的刪除和插入 (剖析內送的 JSON),能中介軟體已經安裝處理大部分的如所示 圖 2

圖 2 更新資料庫中現有的人員

var updatePerson = function(req, res) {
  if (req.person) {
    var originalPerson = req.person;
    var incomingPerson = req.body;
    var newPerson = _.merge(originalPerson, incomingPerson);
    res.status(200).jsonp(newPerson);
  }
  else {
    res.status(404).jsonp({ message: "Unrecognized person identifier" });
  }
};
// ...
app.put('/persons/:personId', updatePerson);

中的重點 圖 2 是第二個參數的屬性,列舉 lodash 方法合併使用,可能會覆寫上第一個參數具有相同名稱的屬性,否則將在。它是簡單的方法,而不需要終結並重新建立 (這很重要,在此情況下,因為第一個物件是做為我們即席資料庫 personData 陣列內) 的第一個物件複製的第二個到第一個屬性。

好奇心,則為 true 的分支的 if 陳述式可能會緊縮往下到另一行程式碼:

var updatePerson = function(req, res) {
  if (req.person) {
    res.status(200).jsonp(_.merge(req.person, req.body));
  }
  else {
    res.status(404).jsonp({ message: "Unrecognized person identifier" });
  }
};

...但那是否可讀取更多或更少是由您決定。

總結

任何要計算的人,開始在這一系列的第二個部分的 app.js 檔案現在是完全 100 行程式碼 (其中包含關於註解穿越線),現在可支援對記憶體中資料庫的完整 CRUD Web API。這不是錯誤的文字編輯器中的世紀的價值。但還有更多執行: 系統需要使用向使用 MongoDB,記憶體中資料庫,才能執行,而不會中斷所有的用戶端已經在使用高價值 Web API 那里這項操作必須是測試。沒有人想要執行測試不斷地以手動的方式,讓下一個步驟是加入自動化的測試,確認 MongoDB 轉為順暢且簡易從用戶端的觀點來看。同時...祝各位寫程式!


Ted Neward是 iTrellis,西雅圖 polytechnology 顧問公司的技術長。他曾經撰寫 100 個以上的文件是 F # MVP、 INETA 講師和曾著作或合著著作。與他連絡 ted@tedneward.com 如果您想要讓他來自與您的小組,或是閱讀他的部落格 tedneward.com

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