瞭解 Edge 對 Node.js 模組的支援

您目前查看的是 Apigee Edge 說明文件。
前往 Apigee X 說明文件
info

Apigee Edge 支援哪個版本的 Node.js?

Edge 目前支援 Node.js 0.10.32。

Edge 支援哪些標準 Node.js 模組?

請參閱下表,瞭解 Edge 包含哪些標準 Node.js 模組。在某些情況下,內含模組僅支援部分功能。這些是 Node.js 內建的模組。

Module 狀態 附註
assert 是否支援
buffer 是否支援
child_process 受限制 如果嘗試產生子程序,系統會擲回例外狀況。不過,系統支援「fork」,可產生子指令碼。
cluster 已停用 方法 cluster.isMaster 一律會傳回 true,其他方法則不會實作。 每個 Edge 訊息處理器都會部署一份 Node.js 指令碼。
crypto 是否支援
dns 支援
domain 是否支援
dgram 受限制 由於網路架構的關係,Apigee 環境中的 Node.js 應用程式無法透過 UDP 存取網際網路上的服務。
events 是否支援
fs 受限制 檔案系統存取權僅限於啟動指令碼的目錄,也就是 /resources/node 目錄。Node.js 指令碼可能會讀取及寫入這個目錄中的檔案 (例如做為暫時的暫存區),但無法保證檔案的保留時間。
http 是否支援 傳入要求的虛擬主機和路徑是在 API Proxy 中指定,而非由 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 Proxy 的 Apigee Edge 管理 UI 中,按一下「Node.js Logs」按鈕。

在 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 上取得。

Module 說明
apigee-access 讓在 Apigee Edge 平台上執行的 Node.js 應用程式存取 Apigee 專屬功能。您可以使用這個模組執行下列操作:存取及修改流程變數、從安全儲存空間擷取資料,以及使用 Edge 快取、配額和 OAuth 服務。另請參閱「使用 apigee-access 模組」。
trireme-support 讓 Node.js 應用程式充分運用 Trireme 專屬功能。目前僅支援一項功能,也就是載入以 Java 建構的 Node.js 模組。注意: Edge Cloud 不支援 loadJars。
trireme-xslt 呈現 XLST 處理的抽象概念。這項功能專為 Trireme 平台設計,可在 Java 上執行 Node.js 應用程式時,有效處理 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 管理 UI 中代理程式的「Node.js Logs」按鈕。您也可以使用「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 需要這個「port」引數,但 Apigee Edge 會忽略這個參數。Node.js 指令碼執行的 API Proxy 會指定要監聽的「虛擬主機」,Node.js 應用程式會使用這些虛擬主機,就像任何其他 Apigee Edge Proxy 一樣。

Apigee 中的每個環境都至少有一個虛擬主機。虛擬主機會定義與 Apigee 機構連線的 HTTP 設定。環境中的所有 API Proxy 都共用相同的虛擬主機。根據預設,每個環境都有兩個虛擬主機:defaultsecure。詳情請參閱「 取得虛擬主機」和「API 開發生命週期」。

apigeetool deploynodeapp 指令會產生 Node.js 應用程式周圍的 Apigee Edge 代理程式包裝函式。部署後,Node.js 應用程式會監聽環境定義的預設虛擬主機。Node.js 應用程式的網址一律為 http://{org_name}-{env_name}.apigee.net

處理傳入要求

與其他 Apigee Edge 應用程式一樣,如果 Proxy 應用程式設為在 secure 虛擬主機上接聽,就會接受使用 HTTPS 的傳入要求。

處理傳出要求

除了接收傳入流量,Apigee Edge 內的 Node.js 應用程式也可以使用 httphttps 模組,發出外送要求,就像其他 Node.js 應用程式一樣。這些模組在 Node.js 內部的運作方式與以往相同。

瞭解對 tls 模組的支援

Apigee Edge 支援 Node.js tls 模組。 這個模組使用 OpenSSL 提供傳輸層安全標準 (TLS) 和/或安全資料傳輸層 (SSL) 加密串流通訊。您可以使用 tls 模組,從 Edge 上執行的 Node.js 應用程式,建立與後端服務的安全連線。

如要瞭解 Apigee Edge 上的 tls 模組運作方式,請務必瞭解 Apigee Edge 如何使用 virtual hosts。Apigee 中的每個環境都至少有一個虛擬主機。虛擬主機會定義與 Apigee 機構連線的 HTTP 設定。環境中的所有 API Proxy 都共用相同的虛擬主機。根據預設,每個環境都有兩個虛擬主機:defaultsecure。如要進一步瞭解虛擬主機,請參閱「 取得虛擬主機」和「API 開發生命週期」。

接下來,我們將瞭解 Apigee Edge 如何處理 Node.js 應用程式傳入和傳出要求的 TLS (SSL) 通訊:

處理傳入要求

視貴機構的虛擬主機設定方式而定,Edge 提供下列選項:

  • 如果 API Proxy 設定為監聽 default 虛擬主機,就會接受透過 HTTP 傳送的要求。
  • 如果 API Proxy 設定為監聽 secure 虛擬主機,就會接受透過 HTTPS 傳送的要求。網址會位於 apigee.net 網域下,並使用 *.apigee.net 的萬用 SSL 憑證。只要應用程式向 apigee.net 網域發出要求,SSL 憑證就會正常驗證。

處理傳出要求

您可以使用 tls 模組發出外送要求,方式與在 Node.js 中正常發出要求相同。基本上,您需要在 resources/node 目錄中新增用戶端金鑰和憑證 (.pem 檔案),並在指令碼中載入這些檔案。如要瞭解如何使用 tls 模組及其方法,請參閱 Node.js tls 模組說明文件。

進階 ScriptTarget 設定

在 <TargetEndpoint> 定義中,<ScriptTarget> 元素除了 <ResourceURL> 之外,還會採用其他選用參數。您也可以使用 <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>