瞭解 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 內建的模組。

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 的 Node.js 記錄按鈕,以及 API Proxy 的 Apigee Edge 管理 UI。

在 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 使用。

Module 說明
apigee-存取 允許在 Apigee Edge 平台上執行的 Node.js 應用程式存取 Apigee 專屬功能。您可以使用這個模組:存取及修改流程變數、從安全儲存庫擷取資料,以及使用 Edge 快取、配額和 OAuth 服務。另請參閱使用 apigee-存取 模組
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 設定」。
  • 針對標準輸出,您只能在 Proxy 的 Edge 管理 UI 中使用「Node.js 記錄檔」按鈕。您也可以使用「apigeetool getlogs」指令。詳情請參閱部署獨立的 Node.js 應用程式
  • 不支援需要原生程式碼的模組。
  • 不支援需要使用 EcmaScript 6 功能的模組,例如 Promise 和產生器。
  • 系統不支援「harmony-proxies」等 Node.js 執行階段旗標。

在 Edge 上設定私有雲的 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 重新啟動

瞭解 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 Proxy 包裝函式。部署之後,Node.js 應用程式會監聽為環境定義的預設虛擬主機。Node.js 應用程式的網址一律為 http://{org_name}-{env_name}.apigee.net

處理傳入要求

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

處理傳出要求

除了接收連入流量之外,Apigee Edge 中的 Node.js 應用程式也可以使用 httphttps 模組發出傳出要求,就像其他 Node.js 應用程式一樣。這些模組的運作方式與在 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 Proxy 都會共用相同的虛擬主機。根據預設,每個環境都有兩個虛擬主機:defaultsecure。如要進一步瞭解虛擬主機,請參閱「 取得虛擬主機」和「API 開發生命週期」。

現在,讓我們來看看 Apigee Edge 如何在 Node.js 應用程式上處理傳入和傳出要求的傳輸層安全標準 (SSL) (SSL) 通訊:

處理傳入要求

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

  • 如果將 API Proxy 設定為監聽 default 虛擬主機,則 API Proxy 會接受 HTTP 要求。
  • 如果將 API Proxy 設定為監聽 secure 虛擬主機,則會接受透過 HTTPS 提出的要求。這個網址會位於 apigee.net 網域下,並會使用 *.apigee.net 的萬用字元安全資料傳輸層 (SSL) 憑證。只要應用程式向 apigee.net 網域發出要求,安全資料傳輸層 (SSL) 憑證就會照常驗證。

處理傳出要求

您可以透過 tls 模組發出傳出要求,方法與在 Node.js 中相同。基本上,您需要將用戶端金鑰和憑證 (.pem 檔案) 新增至 resources/node 目錄,並在指令碼中載入。如要進一步瞭解如何使用 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>