基于 Nodejs 的 Web 服务器

为了组织我们项目的服务器部分,我们需要一个 Web 服务器。我们将使用最轻、技术最先进的节点。它的服务器端脚本可以用 JavaScript 编写,JavaScript 与交互式 Web 浏览器中使用的语言相同。从系统的客户机和服务器部分的统一编写的角度来看,这是方便的;一般来说,任何 Web 服务的客户端部分迟早都是需要的,例如,用于管理、注册和显示服务使用的漂亮统计数据。

任何了解 MQL5 的人实际上都了解 JavaScript,所以相信自己。侧栏中讨论了主要的区别。

MQL5 vs JavaScript
 
JavaScript 是一种解释语言,而 MQL5 是编译语言。对于我们这些开发人员来说,这会减少我们很多负担,因为我们不需要单独的编译阶段来获得一个工作程序。不用担心 JavaScript 的效率:所有的 JavaScript 运行时都是按需使用 JavaScript 的 JIT (just-in-time) 编译,也就是第一次访问模块的时候。这个过程在每个会话中自动隐式地发生一次,之后脚本以编译后的形式执行。
 
MQL5 指的是静态类型化的语言,即在描述变量时,我们必须显式指定其类型,编译器监控类型兼容性。相比之下,JavaScript 是一种动态类型语言:变量的类型由我们放入的值决定,并且可以在变量的生命周期中改变。这提供了灵活性,但需要谨慎,以避免不可预见的错误。
 
从某种意义上说,JavaScript 是一种比 MQL5 更面向对象的语言,因为其中几乎所有的实体都是对象。例如,函数也是对象,而作为对象特性描述符的类也是(原型的)对象。
 
JavaScript 本身“收集垃圾”,即释放应用程序为对象分配的内存。在 MQL5 中,我们必须为动态对象提供及时的 delete 调用。
 
JavaScript 语法包含许多方便的“缩写”,而 MQL5 中实现相同功能则需要编写更冗长的代码结构。例如,为了将指向另一个函数的参数传递给 MQL5 中的某个函数,我们需要使用 typedef,单独定义一个与这个原型匹配的函数,然后将它的标识符作为参数传递。而在 JavaScript 中,你可以定义你所指向的函数(完整地!)而不是指针参数。

如果你是 Web 开发人员或者已经熟悉 nodejs,可以跳过安装和配置步骤。

可以从官方网站下载 nodejs nodejs.org。安装有不同的版本,例如,使用安装程序或解压缩归档文件。安装后,你将在指定的 node.exe 目录中收到一个可执行文件以及若干支持文件和文件夹。

如果安装程序没有将 nodejs 添加到系统路径中,可以通过在安装 nodejs 的文件夹(node.exe 文件所在的位置)中运行以下命令来为当前 Windows 用户添加:

setx PATH "%CD%"

或者,你可以从系统特性对话框(Computer-> Properties -> Extra options ->Environment Variables 编辑 Windows 环境变量;具体对话框类型取决于操作系统的版本)。无论如何,通过这种方式,我们将确保从计算机上的任何文件夹运行 nodejs 的能力,这在将来对我们是有用的。

你可以通过运行以下命令(在 Windows 命令行中)来检查 nodejs 的运行状况:

node -v
npm version

第一个命令输出 nodejs 的版本,第二个命令输出一个重要的内置 nodejs 服务,npm 包管理器。

包是一个现成的模块,它向nodejs添加特定的功能。nodejs 本身非常小,如果没有包,它将需要大量的例行编码。

请求最多的包存储在 Web 上的中央存储库中,可以下载并安装在 nodejs 的特定副本上或全局安装(如果机器上有几个 nodejs 的副本,则为 nodejs 的所有副本)。使用以下命令将软件包安装到特定副本:

npm install <package name>

在安装 nodejs 的文件夹中运行该软件包。此命令将把软件包放在本地,不会影响已经存在的或以后可能出现在计算机上的 nodejs 的其他副本,也不会影响意外的编辑。

我们尤其需要 ws 软件包,它实现了 WebSocket 协议。也就是说,你需要运行以下命令:

npm install ws

等待该过程完成。运行结果是,<nodejs_install_path>/node_modules/ 文件夹应包含一个新的子文件夹 ws,其中包含必要的内容(你可以查看 README.md 文件中包的说明,以确保它是一个 WebSocket 协议库)。

该软件包中包含了服务器和客户端的实现。我们不使用后者,而是在 MQL5 中编写自己的客户端。

Nodejs 服务器的所有功能都集中在 /node_modules 文件夹中。就用途而言,它与 MetaTrader 5 中的标准文件夹 MQL5/Include 相当。用 JavaScript 编写应用程序时,我们将以一种特殊的方式包含或“导入”必要的模块,类似于在 MQL5 中使用 #include 指令包含 mqh 头文件。