# 孜孜不倦的程序員 - 如何成為 MEAN: 快速輸入
通過?[Ted Neward](https://msdn.microsoft.com/zh-cn/magazine/mt149362?author=Ted+Neward)?|2015 年 12 月

歡迎回來,"Nodeists。"(我已建立的為那些定期使用 Node.js endearment 半官方詞。如果您不喜歡它,將一封電子郵件或使用更好的建議 tweet 拖至,應謹記我其他兩個的觀點是"Noderati"或"Nodeferatu。")
在上一期中,大小已達到應用程序的 Web API 終結點獲取的人員 (我的資源為此應用程序; 集合窗體中包含一些輸出功能,我似乎要構建某種類型的用戶數據庫) 或者通過給定的 URL 的一部分為任意"id"的各個人員。就可以開始處理輸入 — 能夠將新的用戶放到系統中,從系統中移除用戶,并更新現有人員。在某些方面,這些是"只是"新的 URL 終結點應用程序,但有一些新技巧,我想談一談此過程。
我前面提到的最后一次,那些有興趣查看最新版本-和-的最大編寫此系列的一部分的可訪問 Microsoft Azure 網站的代碼,它持有此序列的代碼 (msdn mean.azurewebsites.net) 的最新。很可能文本在此處使用在站點上,提供發布計劃是什么是同步的但如果任何內容,該網站就會領先于什么在這里,它為讀者提供的展望迎接下一步。
談到的最后一列,截至上一期的代碼可以在數據庫中,顯示現有人員但其中沒有修改說明,否則還。因為這通常是聯機的任何系統的關鍵部分,讓我們添加到"R"以完成出 CRUD"CUD"。
## 另一個 Bites 灰塵...
若要實現第一次也是最容易 CRUD 中的"D": 刪除。設置 Express 中的路由需要僅使用代碼,而非 get 使用上一次刪除:
~~~
app.delete('/persons/:personId', deletePerson);
~~~
還記得我的上一篇專欄,": personId"是一個參數,將出現在關聯的函數 (deletePerson) 中的 Express"必需"(請求) 對象和拾取也描述了最新時間、 personId 中間件函數,以便您可以知道要從系統中刪除人員。
說到 deletePerson,實現相對來說比較簡單,使用 lodash remove 方法在內存中數據庫中搜索和刪除所述的個人 (請參閱?圖 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 (無論它的值)、 在數據庫中找到適當的 person 對象和放置,為人對傳入的請求 ("請求") 對象屬性,因此如果沒有 req.person,這意味著沒有人會通過該 ID 在數據庫中找。當您發送響應時,但是,而不是將結果到 JSON 轉換是通過內置的 JSON.stringify 方法,從先前的文章中,使用 jsonp 方法將數據轉換為 JSON 格式的 — 或者,若要更準確,被廣泛認為可以向瀏覽器發送 JSON 返回的上級 (和更安全) 的方式為 JSONP (且填充 JSON) 格式。請注意該方法如何調用"鏈";這意味著您可以使用一個 fluent 代碼行組成此人已成功,刪除一條消息或 404,人的標識無法識別的消息的 JSON 響應一起發回的任一 200。
## 獲取向我的數據庫
接下來,應該到數據庫可能支持放置的人。同樣,這是非常簡單的路由: Web API 的擁護者按傳統方法,建議使用發布到的資源集合 URL (/ 人員) 的方式,將插入到數據庫,那么做,如:
~~~
app.post('/persons', insertPerson);
~~~
不特別令人興奮。但是,新的小問題就會顯現出來: 為了插入到系統的人員,您將需要挑選 person 數據從傳入的請求的 JSON。做到這一點的一種方法是獲取整個請求正文使用 req.body 參數,但再從左到適用于存儲對象分析 JSON 的繁重 (和略有危險) 的任務。相反,這其中 Node.js 社區立足于庫中,其廣泛集合并且果然,沒有好的庫有,解決了該問題,稱為正文分析器。安裝它 ("npm 安裝正文的解析程序"作為 package.json 的相同目錄中),然后可以引用它,并告知速成版應用程序對象來使用它:
~~~
// 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,有關如何快速允許您創建以作為管道的一部分無提示方式執行少量工作的中間件函數? 這正是正文分析器庫的作用,它將安裝大量"掛鉤"(for lack of 更好的詞) 處理中各種形式的請求正文。在這里,你要讓它來分析 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);
};
~~~
(好了,唯一 id 生成代碼無法使用了大量工作,但請記住的目標是最終使用 MongoDB,因此,讓我們不會花大量時間考慮。)
在從 insertPerson 返回時,該代碼發送回完整 Person 對象剛插入,包括其新的 id 字段;這不是一個完全標準約定,但在我自己的代碼中我發現它很有幫助。這種方式客戶端時注意到任何其他驗證/更正/服務器的一側的增加的已提交的實體,如 id 字段在此情況下。
## 如何發布三個?
順便說一下,有關這種方式 (而不是更傳統的 Web 應用程序) 構建 Web API 值得關注的部分之一是,一些簡單的戲法,用于執行應急測試對您不適用。例如,如何您快速測試以查看 insertPerson 函數的工作? 當然,還有大量的支持自動執行在 Node.js 中測試和隨后在將來的專欄中,但現在,是最容易使用任一瀏覽器插件 (如 Chrome Postman) 或者,因忠實的命令行風扇 cURL 免費軟件實用程序隨附預先安裝在 OS X 和大多數 Linux 上圖像。您不喜歡其中任何一個,是否存在許多其他所有的復雜性,從臨時到自動化的整個整個范圍內拉伸包括一個我的收藏夾,Runscope ([runscope.com](http://runscope.com/)),以進行的內容全天候運行自動測試 API 終結點,一個基于云的系統。
無論您使用什么,如果您不喜歡它,移動速度快,因為實際上有數千個所以。
## 與鄰居保持為最新
最后,應用程序需要支持更新的人員已經在該數據庫。在許多方面,這是組成的復雜程度 (在數據庫中查找適當的人員) 的刪除和插入 (分析傳入 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,并為此而不會破壞所有已在使用此高度那里 prized Web API 的客戶端必須是測試。沒有人希望獲得其進行測試,又一遍地手工,因此接下來的步驟是將添加自動的測試,以確保轉換到 MongoDB 是無縫且簡單從客戶端的角度來看。同時...祝您編碼愉快 !
* * *
Ted Neward?*是 iTrellis,基于西雅圖的 polytechnology 咨詢公司的 CTO。他曾寫過 100 多篇文章,是一個 F # MVP、 INETA 發言人,并且具有編寫或與他人合著過十幾本書。與他聯系。[ted@tedneward.com](mailto:ted@tedneward.com)?如果您感興趣他參與使用你的團隊,或閱讀他的博客?[tedneward.com](http://tedneward.com/)。*
- 介紹
- Visual Studio - 用于 Web 開發的新式工具: Grunt 和 Gulp
- 新員工 - 放長錢釣大魚
- Microsoft Azure - Azure Service Fabric 和微服務體系結構
- 數據點 - Aurelia 與 DocumentDB 結合: 結合之旅(第 2 部分)
- 游戲開發 - Babylon.js: 構建 Web 基本游戲
- 測試運行 - 面向 .NET 開發者的 Spark 簡介
- Xamarin - 使用 Xamarin.Forms 構建跨平臺用戶體驗
- 孜孜不倦的程序員 - 如何成為 MEAN: 快速輸入
- Microsoft Azure - Azure、Web API 和 Redis 如何有助于加快數據交付
- 必備 .NET - 設計 C# 7
- 新式應用 - 需要了解的 Windows 10 應用開發概念
- 別讓我打開話匣子 - 重構高等教育
- 編者注 - 再見 Kenny