了解 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 基础架构内的日志文件。您可以通过点击 API 代理的 Node.js 日志按钮和 Apigee Edge 管理界面来查看这些日志。

在 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 不支持但 Apigee Edge 上运行的 Trireme 和 Trireme 支持的模块。Trireme 是在 Apigee Edge 上运行的开源 Node.js 容器。它设计用于在 Java 虚拟机 (JVM) 内运行 Node.js 脚本。所有这些模块都可以在 NPM 上找到。

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

支持常用的 Node.js 模块

对 Node.js 脚本的限制

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

  • 由于采用边缘网络架构,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 和 Generator)的模块。
  • 不支持“harmony-proxies”之类的 Node.js 运行时标志。

在 Edge 上为私有云设置 IP 连接限制

私有云边缘可以限制 Node.js 代码访问以“10.”、“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-serviceedge-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.');
});

此“port”参数在 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 中的工作原理,请务必了解如何在 Apigee Edge 中使用 virtual hosts。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>