# 工作的程序员如何成为平均: Express 路由
通过 [Ted Neward](https://msdn.microsoft.com/zh-cn/magazine/mt149362?author=Ted+Neward) | 2015 年 11 月
![](https://box.kancloud.cn/2016-01-08_568f2a84072a2.jpg)
欢迎回来,"Nodeists。"(如果出现这种的官方术语,对于那些在定期进行,但对我来说比"Nodeheads"或"Noderati"或"Nodeferatu。"更好的 Nodeists 声音上使用 Node.js,我有不知道)
在上一期 ([msdn.com/magazine/mt573719](http://msdn.com/magazine/mt573719)),该应用程序的堆栈已经从正在向通过安装 Express 一起 Node.js"EN"堆栈"N"堆栈 (只是节点)。看起来会跳转到其他事情上直接,有几个问题有关快速 — 及其支持的包和库 —,值得探索和进一步讨论。您以前获得了一种,初步了解到表示路由,如果代码设置了一个函数以显示"Hello World"与"/"相对 URL 路径的 HTTP 请求的响应。现在,我将深入进入 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,"put;和"删除,"您可以使用 delete。Express 也支持其他谓词,但出于相当明显的原因,这些是您最关心的四个。每个然后还将作为其第二个参数函数,该示例中 图 1 是文字用于处理传入的 HTTP 请求的函数。
## 平均值中的"E"
通常,当 Nodeists 编写基于速成版的应用程序,用户这样做相同的方式,我们"。NETers"编写 ASP.NET 应用程序。服务器会生成一个 HTML 文档其中包含与数据,并发送回浏览器中,在其后用户填写窗体和文章输入的数据回 Express; 混合的演示文稿 (HTML)或者,用户单击的链接,并生成在速成版进行完整的服务器端周期再次返回 GET。而且,由于在 Node.js 中的手写 HTML 是因为它是 Visual Basic 或 C# 中只是更有趣,许多工具都源自 Node.js 世界上设计用于满足的 Razor 语法未在传统的 ASP.NET 应用程序中的相同的目的。还可以容易地编写而混合存放数据的表示层和太多代码。
但是,平均值基于应用程序,AngularJS 将形成完整的客户端体验,因此 Express 散射与 ASP.NET MVC 相同的角色 — 它是只需一个传输层,从客户端执行 (通常采用的 JSON 形式) 的原始数据、 对该数据 (通常将其存储、 修改它,或查找关联或相关数据) 进行操作和将原始数据 (再次发送通常以 JSON 形式) 返回到客户端层。为此,我们旅居 Express 中的会避免的主题的模板化框架 (的这几个在 Node.js 世界、"handlebars"和"jade"正在更受欢迎的两个),和我将重点介绍显式只需来回传送 JSON。一些将调用此 rest 风格的终结点,但,坦白地讲,其余部分涉及到的作用远远不只是 HTTP 和 JSON,并构建 Fielding 批准的 RESTful 系统是远远超出本系列丛书的作用域。
因此,现在,我将讨论有关持续想到使用一组任意 JSON 使用客户端要使用的简单只读的终结点。
## 在 JSON 中的 hello,
通常情况下,Web API 遵循一个用于获取数据相当松散的结构:
* 对给定的资源类型 (例如"persons") 的 GET 请求将产生一个对象,其中包含最小值的唯一标识符 (单独检索) 和通常某种类型的简短的说明性文本,适合在选项列表中显示每个数组的 JSON 结果。
* 对给定资源的 GET 请求键入 URL ("persons/1234,"其中 1234年标识符唯一标识我们感兴趣的人) 的一部分将产生 (通常) 是一个描述一定程度的详细信息中的资源的单个 JSON 对象的 JSON 结果标识符。
Web Api 还将使用 PUT、 POST 和删除,但现在,我将重点介绍的办法检索数据。
因此,假设"persons"资源类型,您将创建两个终结点,其中一个标记为"/ persons,"和其他"/persons/ 。" 对于初学者而言,您需要一个较小的人员能够使用"数据库"— 名字、 姓氏和"status"及其当前 (任何往来奔波现在做) 就足够了 (请参阅 图 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),这是更常见,因为它有助于保持分离关注点更干净 — 函数将充当 (在模型-视图-控制器的意义上) 的控制器。现在,我使用 JSON.stringify 将 JavaScript 对象的数组序列化为 JSON 表示形式,但我将更高版本使用更好的内容。
接下来,您需要一个终结点对于人的对象,但这将花费更多执行操作因为您需要挑选作为参数,人员标识符和 Express 具有执行此操作的特定方式。一种方法 (无疑是更简便的方法在图面上的事情) 是用于请求对象 ("必需"给路由映射中使用的函数的参数) 的"params"对象提取的路由中指定的参数但 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();
});
~~~
何时调用路由、 任何如下所示"/ persons"(如"/ 人员/1") 就像您可能会发现与 ASP.NET MVC 将绑定到名称"personId"的参数。但然后使用 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 });
}
};
~~~
请参阅我的"普通"的意思吗?
## 总结
我稍微添加一点如何处理速成版,但虽的势头此处,我还有其他空间对于此示例,因此...祝您编码愉快 !
* * *
Ted Neward *是 itrellis 一家咨询服务公司首席技术官。他已编写的 100 多篇文章和编写或与他人合著过十几本书,包括"Professional F # 2.0 》 (Wrox,2010 年)。他是 F # MVP,经常在世界各地的会议上。他定期担任顾问和导师,如果您感兴趣,请通过 [ted@tedneward.com](mailto:ted@tedneward.com) 或 [ted@itrellis.com](mailto:ted@itrellis.com) 与他联系。*
- 介绍
- Essential .NET - C# 异常处理
- 崛起 - 具备批判精神
- Windows 10 - 通过搜索索引器加快文件操作速度
- 最前沿的技术 - 利用用户体验驱动设计改善体系结构
- 异步编程 - 从头开始执行异步操作
- 数据点 - Aurelia 与 DocumentDB 结合: 结合之旅
- ASP.NET - 将 ASP.NET 用作高性能文件下载器
- 测试运行 - 使用 C# 执行 t-检验
- Microsoft Azure - 通过 SonarQube 和 TFS 管理技术债务
- 孜孜不倦的程序员 - 如何成为 MEAN: Express 路由
- 别让我打开话匣子 - Alan Turing 和 Ashley Madison
- 编辑寄语 - 欢迎使用 Essential .NET