了解 Edge 对 Node.js 模块的支持

您正在查看 Apigee Edge 文档。
前往 Apigee X 文档
信息

Apigee Edge 支持哪个版本的 Node.js?

Edge 目前支持 Node.js 0.10.32。

Edge 支持哪些标准 Node.js 模块?

使用下表确定 Edge 上包含哪些标准 Node.js 模块。在某些情况下,随附的模块仅部分受支持。这些是 Node.js 内置的模块。

模块 状态 备注
assert 支持
buffer 支持
child_process 受限 如果尝试生成子进程,系统会抛出异常。不过,支持使用“fork”来生成子脚本。
cluster 已停用 方法 cluster.isMaster 始终返回 true,其他方法未实现。 每个 Node.js 脚本的一个副本会部署到每个 Edge 消息处理器。
crypto 支持
dns 支持
domain 支持
dgram 受限 由于我们的网络架构,Apigee 环境中的 Node.js 应用将无法通过 UDP 访问互联网上的服务。
events 支持
fs 受限 文件系统访问权限仅限于启动脚本的目录:/resources/node 目录。Node.js 脚本可以读取和写入此目录中的文件(例如作为临时暂存区),但无法保证文件会保留多长时间。
http 支持 传入请求的虚拟主机和路径是在 API 代理中指定的,而不是由 HTTP 模块指定的。如需了解详情,请参阅“了解对 http 和 https 模块的支持”。
https 支持 创建“https”服务器的行为与创建“http”服务器的行为完全相同。如需了解详情,请参阅“了解对 http 和 https 模块的支持”。
module 支持
net 受限 尝试监听传入的 TCP 连接会生成异常。
path 支持
module 支持
process 部分支持 不支持用于操纵用户 ID、群组成员资格和工作目录的功能。
punycode 支持
querystring 支持
readline 已停用 在 Apigee Edge 上运行的脚本没有标准输入。
repl 已停用 在 Apigee Edge 上运行的脚本没有标准输入。
module 已包含
STDIO 支持

标准输出和错误会路由到 Apigee Edge 基础架构中的日志文件。您可以在 Apigee Edge 管理界面中点击 API 代理中的 Node.js 日志按钮,查看这些日志。

在 Apigee Edge 上运行的脚本没有标准输入。不过,您可以使用 TargetEndpoint 的 ScriptTarget 元素传递实参。如需了解详情,请参阅高级 ScriptTarget 配置

stream 支持
string_decoder 支持
timers 已包含
tls 支持 传输层安全协议 (TLS) 参数的工作方式与常规 Node.js 中的工作方式基本相同。如需了解详情,请参阅在 Apigee Edge 上使用 TLS (SSL) Node.js 模块
tty 已停用 在 Apigee Edge 上运行的脚本没有标准输入。
url 支持
util 支持
vm 支持
zlib 支持

其他受支持的模块

本部分列出了标准 Node.js 中不支持但在 Trireme 和在 Apigee Edge 上运行的 Trireme 中受支持的其他模块。Trireme 是在 Apigee Edge 上运行的开源 Node.js 容器。它旨在在 Java 虚拟机 (JVM) 中运行 Node.js 脚本。所有这些模块均可在 NPM 上获取。

模块 说明
apigee-access 允许在 Apigee Edge 平台上运行的 Node.js 应用访问 Apigee 特有的功能。您可以使用此模块来:访问和修改流变量、从安全存储区检索数据,以及使用 Edge 缓存、配额和 OAuth 服务。另请参阅使用 apigee-access 模块
trireme-support 让 Node.js 应用能够利用 Trireme 特有的功能。目前仅支持一项功能,即加载用 Java 构建的 Node.js 模块。注意:Edge Cloud 不支持 loadJars。
trireme-xslt 提供 XSLT 处理的抽象。它专门为 Trireme 平台设计,可在 Node.js 应用在 Java 上运行时高效处理 XSLT。
trireme-jdbc 提供从 Node.js 访问 JDBC 的权限。注意:Edge Cloud 不支持此功能。对于 Edge Private Cloud,您可以将 JDPC JAR 文件放在类路径中,然后使用此模块。

对常用 Node.js 模块的支持

Node.js 脚本的限制

不过,请注意,Edge 对 Node.js 脚本施加了某些限制,例如:

  • 由于 Edge 边缘网络架构,Apigee Edge 环境中的 Node.js 应用无法通过 UDP 访问互联网上的服务。
  • 文件系统访问权限仅限于启动 Node.js 脚本的目录:/resources/node 目录。Node.js 脚本可以读取和写入此目录中的文件(例如作为临时暂存区),但无法保证文件会保留多长时间。
  • 尝试侦听传入的 TCP 连接会生成异常。
  • 不支持用于操纵用户 ID、群组成员资格和工作目录的功能。
  • 对于标准输入,您只能使用 TargetEndpoint 的 ScriptTarget 元素传递实参。如需了解详情,请参阅高级 ScriptTarget 配置
  • 对于标准输出,您只能使用 Edge 管理界面中代理的“Node.js 日志”按钮。您还可以使用“apigeetool getlogs”命令。如需了解详情,请参阅部署独立的 Node.js 应用
  • 不支持依赖于原生代码的模块。
  • 不支持依赖于 EcmaScript 6 功能(例如 Promise 和生成器)的模块。
  • 不支持 Node.js 运行时标志(例如“harmony-proxies”)。

在 Edge for Private Cloud 上设置 IP 连接限制

Edge for Private Cloud 可以限制 Node.js 代码访问以“10.”开头的 IP 地址,“192.168”和 localhost。如果您尝试访问这些 IP 地址,则会看到如下形式的错误:

{ [Error: connect EINVAL] message: 'connect EINVAL', code: 'EINVAL', errno: 'EINVAL', syscall: 'connect' }

您可以在每个消息处理器的 message-processors.properties 文件中设置 conf_nodejs_connect.ranges.denied 属性,以修改这些限制。默认情况下,此属性的值为:

  • Edge 4.17.05 及更低版本conf_nodejs_connect.ranges.denied=10.0.0.0/8,192.168.0.0/16,127.0.0.1/32
  • Edge 4.17.09 及更高版本conf_nodejs_connect.ranges.denied=(表示无限制)

如需设置此属性,请执行以下操作:

  1. 在编辑器中打开 message-processor.properties 文件。如果该文件不存在,请创建它:
    > vi /<inst_root>/apigee/customer/application/message-processor.properties
  2. 根据需要设置相应属性。例如,如需仅拒绝访问 localhost,请使用以下命令:
    conf_nodejs_connect.ranges.denied=127.0.0.1/32
  3. 保存更改。
  4. 确保属性文件归“apigee”用户所有:
    > chown apigee:apigee /<inst_root>/apigee/customer/application/message-processor.properties
  5. 重启消息处理器:
    > /<inst_root>/apigee/apigee-service/bin/apigee-service edge-message-processor restart

了解对 http 和 https 模块的支持

在 Apigee Edge 中运行的所有 Node.js 应用都必须使用 httphttps 模块来监听传入请求。如果您部署的脚本不侦听传入请求,它只会执行并退出。

Node.js 中 httphttps 模块的 listen 方法将端口号作为参数。例如:

svr.listen(process.env.PORT || 9000, function() {
   console.log('The server is running.');
});

此“端口”实参在 Node.js 中是必需的,但 Apigee Edge 会忽略此参数。相反,运行 Node.js 脚本的 API 代理会指定其监听的“虚拟主机”,而 Node.js 应用会使用这些相同的虚拟主机,就像任何其他 Apigee Edge 代理一样。

Apigee 中的每个环境都至少有一个虚拟主机。虚拟主机定义了与 Apigee 组织连接的 HTTP 设置。环境中的所有 API 代理共享相同的虚拟主机。默认情况下,每个环境都有两个可用的虚拟主机:defaultsecure。如需了解详情,请参阅 获取虚拟主机API 开发生命周期

apigeetool deploynodeapp 命令会围绕 Node.js 应用生成一个 Apigee Edge 代理封装容器。部署后,Node.js 应用会监听为环境定义的默认虚拟主机。Node.js 应用的网址始终为 http://{org_name}-{env_name}.apigee.net

处理传入请求

与其他 Apigee Edge 应用一样,如果代理应用设置为侦听 secure 虚拟主机,则它将接受使用 HTTPS 的入站请求。

处理出站请求

除了接收传入流量之外,Apigee Edge 中的 Node.js 应用还可以像任何其他 Node.js 应用一样,使用 httphttps 模块发出出站请求。这些模块在 Node.js 中的工作方式与以往完全相同。

了解对 tls 模块的支持

Apigee Edge 支持 Node.js tls 模块。 此模块使用 OpenSSL 提供传输层安全 (TLS) 和/或安全套接字层 (SSL) 加密流通信。您可以使用 tls 模块从在 Edge 上运行的 Node.js 应用创建与后端服务的安全连接。

如需了解 tls 模块在 Apigee Edge 上的运作方式,请务必了解 virtual hosts 在 Apigee Edge 上的使用方式。Apigee 中的每个环境都至少有一个虚拟主机。虚拟主机定义了与 Apigee 组织连接的 HTTP 设置。环境中的所有 API 代理共享相同的虚拟主机。默认情况下,每个环境都有两个可用的虚拟主机:defaultsecure。如需详细了解虚拟主机,请参阅 获取虚拟主机API 开发生命周期

现在,我们来看看 Apigee Edge 如何处理 Node.js 应用中传入和传出请求的 TLS (SSL) 通信:

处理传入请求

Edge 提供以下选项,具体取决于为组织配置虚拟主机的方式:

  • 如果 API 代理配置为侦听 default 虚拟主机,则它会接受通过 HTTP 发出的请求。
  • 如果 API 代理配置为在 secure 虚拟主机上监听,则它会接受通过 HTTPS 发出的请求。网址将位于 apigee.net 网域下,并将使用 *.apigee.net 的通配符 SSL 证书。只要应用向 apigee.net 网域发出请求,SSL 证书就会正常验证。

处理出站请求

您可以使用 tls 模块发出出站请求,就像在 Node.js 中正常操作一样。基本上,您需要将客户端密钥和证书(.pem 文件)添加到 resources/node 目录,并在脚本中加载它们。如需了解如何使用 tls 模块及其方法,请参阅 Node.js tls 模块文档。

高级 ScriptTarget 配置

在 <TargetEndpoint> 定义中,<ScriptTarget> 元素除了 <Resource网址> 之外,还接受其他可选参数。您还可以使用 <EnvironmentVariables> 和 <Arguments> 参数将命令行实参和环境变量传递给 Node.js 脚本:
<TargetEndpoint name="default">
  <ScriptTarget>
     <ResourceURL>node://hello.js</ResourceURL>
     <EnvironmentVariables>
         <EnvironmentVariable name="NAME">VALUE</EnvironmentVariable> 
     </EnvironmentVariables>
     <Arguments>
         <Argument>ARG</Argument>
     </Arguments>
  </ScriptTarget>
</TargetEndpoint>