ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 孜孜不倦的程序员 - 如何成为 MEAN: 快速输入 通过 [Ted Neward](https://msdn.microsoft.com/zh-cn/magazine/mt149362?author=Ted+Neward) |2015 年 12 月 ![](https://box.kancloud.cn/2016-01-08_568f2a84072a2.jpg) 欢迎回来,"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/)。*