2015 年 8 月

第 30 卷,第 8 期

孜孜不倦的程序员 - 如何成为 MEAN: 开始使用

作者 Ted Neward | 2015 年 8 月

Ted Neward平行宇宙风靡一时,尤其是如果您迷上漫画书中的故事。当然,我自己也迷上了一本漫画书。当我首次阅读此杂志时,它被称为 Microsoft 系统日志(简称 MSJ)。选择的语言是 C++ 和 Visual Basic。该基础技术平台是使用不可管理语言(如 C++)和可管理语言(如 Visual Basic)编写的托管平台 (COM)。OS 的选择毫无疑问是 Windows。也许是 Windows 3.0、3.1、Chicago 或 NT,但始终是 Windows。

看看我们今天已取得的成就。很明显,现在不再是“Microsoft”世界,甚至不在 Microsoft 世界内。有时会暂时忘记 Microsoft 的强有力竞争对手,如 Java 或 Ruby。公司和这些语言有合作关系,甚至在下一代 Microsoft Azure 平台上对它们提供本地支持。忘记 Microsoft 所“拥有”的语言,如 C# 或 Visual Basic 或 F#。它们全部已经成为了开放源代码。其所拥有的 Web 框架和数据访问框架也是如此。而且,新版本的 Visual Studio 还配送 Android 模拟器。

就在我们认为无法获得不同的东西时,Microsoft 再次进行突破,同时做出了完全不同的东西。在撰写本文时,Microsoft 刚刚宣布了与 Cyanogen(Android 分销商)之间的合作关系。有人可以告诉我应该通过哪个门户吗?

在漫画中,无论英雄人物何时步入到一个新的世界,总有一个时刻英雄们必须接受新世界或冒着被认为是外来客的风险,而且可能被锁在疯人院中。除非您向往疯人院,否则您应该接受这个新世界。

获取 MEAN

我们开始讨论 Node.js 吧。或者,更确切地说,我们探讨适合 Node.js 平台的最受欢迎的软件堆栈之一吧。 MEAN(MongoDB、Express、AngularJS、Node.js)。它正迅速成为新科技领域的一个重要角色。Microsoft 在 Azure 上支持 Node.js 和 MongoDB(更不用说您可以在本地标准 Windows 计算机轻松地运行它们)意味着每个 Microsoft 开发人员都应该了解一些(如果您了解其中的双关)。

您可以通过几种方式执行 MEAN,包括使用 Visual Studio。首先是“接受节点方式”。 只使用 Node-ish 工具的首选集合:一个文本编辑器、命令行和(如果您周围有一个)Mac。这就是我惯用的开始,尽管大多数命令行命令非常适用于 Windows,不存在任何困难之处,但却有不同之处。

在深入探讨平行宇宙之前,先查看以下主要角色。MEAN 堆栈是“完全堆栈”四重奏,意味着它包括前端、后端和存储器。从前端开始,AngularJS 提供了完整的单页面应用程序 Web 客户端框架,连同“模型-视图-控制器”抽象内容以及 UI 的双向绑定。虽然 AngularJS 完全驻留在前端,但是需要与后端进行通信。通常,这可以使用 Web API 调用。在某些循环里,这也被称为 RESTful 终结点,尽管那可能导致有关什么是 REST 的激烈讨论,但是让我们现在将其保留为 Web API 吧。

这些 Web API 终结点是通过 Node.js 平台顶部的 Express 框架进行构建的。这非常类似于 ASP.NET 管道和 Microsoft .NET Framework 顶部的 ASP.NET Web API。这些后端 Web API 明显需要一个用于存储的数据库,这也是 MongoDB 派上用场的地方。MongoDB 是无架构的以文档为中心的数据存储(与 SQL Server 形成对比,因为它是有架构的以关系为中心的数据存储),其中含有某些内置的分片和 map-reduce 功能。

也许,您已经接触到这三部分(前端、后端和存储器),它们实际上可以进行互换。例如,可以轻松地想象使用 AngularJS 与 ASP.NET Web API 进行通信,而后反过来 ASP.NET Web API 与 MongoDB 进行通信。或者,将 Windows 窗体应用程序用作前端,使 HttpClient 调用 Node.js,反过来 Node.js 与 MongoDB 进行通信。或者,只是完成帽子戏法,即 AngularJS 到 Node.js 再到 SQL Server。

所有这三个组件都可以轻松地进行“交换”,只要前端使用 HTTP(或类似于与平台无关的内容)与后端进行通信。后端还需要一个驱动程序,以便和您选择的数据存储进行通信。

安装 Node.js

实际上,当您着手去做时,您会发现要安装的 Node.js 是非常繁琐的。具有 Azure SDK 的开发人员已安装 Node.js,而且它可能已经位于 PATH 之上,等待启动。只需在命令提示符中键入节点即可验证它是否安装。顺便说一下,如果安装了 Node.js,则 Ctrl+C 可将您带离触发的互动 shell。

您必须在新出厂的 Windows 机器或类似于新的 Mac OS 机器上安装 Node.js。在 Windows 上,执行此操作的最佳方式是获取 Azure SDK,或转到 Node.js 网站以获取 Node.js 的 MSI 安装程序,其默认放在 PATH 之上。虽然 Mac OS 还有一个安装程序,但是在 Mac 上,更好方法是安装另一个称为 Homebrew 的程序包管理器。可在 brew.sh 中获取它。安装以后,这就成了 Mac 上安装任何软件的“首选工具”,包括安装 Node.js。

Homebrew 含有一个简单的“brew 安装节点”,它可以推翻所有 Node.js 位,将它们安装到适当的位置(无需进行根访问来执行操作)并隐式地将其放到 PATH 上。同样,命令行中的“节点”将验证该安装是否能正常工作。启动之后,它可提供您从未安装的任何实体的最低声音响应(如图 1)中所示。

Node.js 正在运行;不,认真地讲,它正在运行
图 1 Node.js 正在运行;不,认真地讲,它正在运行

按 Ctrl+C(两次)可退出 Node.js。虽然您已开始,但尚未完成。

安装 NPM

.NET 领域含有 NuGet。Ruby 领域含有其宝贵之处。Node.js 领域含有节点程序包管理器。它被称为 npm,并且作为 Node.js 本身的一部分进行安装(实际上,npm 是从命令行中运行的小型 Node.js 应用)。安装 Node.js 以后,无需做其他任何事情,只要在命令行中使用“npm”即可触发 npm,如图 2 中所示。

节点程序包管理器
图 2 节点程序包管理器

您最关心的两个命令是 npm 安装和 npm 更新。每个命令都可以将一个或多个 npm 程序包名称提取为参数。安装程序包之后,npm 将从 npm 网站中下载该程序包,就像 NuGet 所做的一样。然后,在当前目录下方的本地硬盘驱动器上进行安装。例如,在一个空的目录中,告知 npm 安装调试程序包(如图 3)中所示。

安装 npm 程序包
图 3 安装 npm 程序包

NPM 工具的回应方式是它已下载调试程序包的版本 2.1.3,其反过来依赖 ms 程序包的版本 0.7.0。更重要的是,二者都已安装到名为 node_modules 的本地目录中。这是您将使用为此应用程序的所有 Node.js 程序包的“本地存储库”。如果出于某种原因您希望全局安装 npm 程序包(安装到共享位置中的 node_modules 目录下的某个位置),则您需要使用 npm 安装 –g 调试。

当这些程序包安装到当前目录之后,使用 Node.js 中的“require”调用来引用它们。它采用一个描述程序包名称的字符串,其中 Node 预期直接在当前目录下方的 node_modules 目录的内部找到它。因此,在名为 helloDebug.js 的文件中的以下节点会加载调试程序包,将其分配到相同名称(Node.js 约定)的变量,并使用它来获取调试流以发出调试信息(类似于 System.Diagnostics.Trace):

var debug = require('debug')('hello');
debug("This should never appear unless DEBUG=hello");

现在,当您运行该节点(节点 helloDebug.js)时,如果有一个名为 DEBUG 的环境变量设置为“hello”,则调试调用将打印到控制台。如果没有,则不显示任何内容。在 Mac 或 Unix 系统上,通过在节点命令前添加分配权限前缀,您可以为 Node.js 的一个运行程序临时设置一个环境变量(如图 4 中所示)。

你好,调试领域
图 4 你好,调试领域

虽然内容不是很多,但是可以让您感觉到 Node.js 开发的工作原理。最重要的是,您应该意识到“Require”调用正在试图加载本地 node_modules 目录以外的程序包。因此,如果 require 调用失败,则表示程序包要么在本地损坏,要么从未安装。在下一个专栏中,我将探讨如何跟踪您安装的 npm 程序包,这样您就无需记住它。

我是否忘记提及所有 Node.js 代码均是 JavaScript? 如果您不喜欢使用 JavaScript,现在是重新学习的好时机。Douglas Crockford 的《JavaScript: 语言精粹》(O’Reilly Media,2008 年)是一个非常好的起点。

安装 MongoDB

将 MongoDB 获取到本地开发系统上确实很繁琐。从 MongoDB 网站 (mongodb.org) 中下载适合您的系统的 .zip 文件,解压该文件,并将二进制文件放到您的 PATH 上。还可在 MongoLab (mongolab.com) 等几个“即服务”类别中获取 MongoDB,其为少于半 G(但足够用于大多数介绍性用途的数据加载提供永远免费的层)。可在本地安装 MongoDB,也可以创建一个 MongoLab 帐户。

MongoDB 下载还具有“mongo”命令行客户端(类似于 SQL Server 命令行客户端的风格和范围)。这对于从 shell 脚本以及类似脚本中访问 MongoDB 数据库非常有用。如果您更注重 GUI,则该领域中有几个免费的 MongoDB GUI 工具。我最喜欢的用于 Mac 的工具是 RoboMongo,用于 Windows 的工具是 MongoVue。

默认情况下,假设 Mongo 在本地运行(表示服务器是“localhost”,而且默认部分是 27017)。如果您不熟悉 Mongo,可以在 msdn.microsoft.com/magazine/ee310029 中查看我早期的 MongoDB 专栏或花几分钟时间了解成千上万篇 MongoDB 在线文章中的任意文章。Bing 此时是您的朋友。

在本地计算机上运行 MongoDB 也很繁琐。假设 MongoDB bin 目录在 PATH 上,则只要触发“mongod”即可。 它会假设可以写入“/var”目录,以存储数据。通常,这不是您所希望的,因此传递一个“--dbpath”参数(请注意双连字符)以指定在其中存储数据的所选目录。

MongoDB 网站上也含有相关说明,介绍了如何将 MongoDB 作为 Windows 服务或 *nix 平台上的后台程序进行运行。但是,在前台“手动”启动它增加了一种优势,即可以查看 MongoDB 日志被写入屏幕的过程。

总结

这是本月的所有内容,不过您已经获得入门的核心。下次,我将在服务器上旋转某些 HTTP 终结点,使用 Express,更多地探讨 Node.js 应用程序的结构是如何构成的,以及如何创建这些终结点以在 Azure 中运行。我还会探讨 Node.js 应用程序将某些工具用作开发的一部分。但现在 …

祝您工作愉快!


Ted Neward 是 iTrellis(一家咨询服务公司)的 CTO。他写过 100 多篇文章,独自撰写并与人合著过十几本书,包括《Professional F# 2.0》(Wrox,2010 年)。他是一位 F# MVP,经常在全球会议上发表演讲。他定期担任顾问和导师,如果您感兴趣,请通过 ted@tedneward.comted@itrellis.com 与他联系。