Node.js でのフロー変数へのアクセス

はじめに

Node.js アプリケーションでは、apigee-access モジュールを使用して Apigee Edge のフロー変数にアクセスします。このモジュールには、変数の取得設定削除に使用するメソッドが用意されています。また、整数変数を設定するための便利なメソッドもあります。

フロー変数は、API プロキシフローのコンテキスト内に存在します。一部の変数は Edge の「組み込み」変数になっています。それ以外はポリシーの実行時に作成されます。独自の変数を作成することもできます。一般にフロー変数は、ポリシー間のデータの受け渡しや、条件フローでの条件の設定に使用されます。フロー変数の詳細については、フローの変数と条件をご覧ください。

apigee-access モジュールの概要と、このモジュールのその他の機能については、apigee-access モジュールの使用をご覧ください。

使用例

リクエストフローパスで実行されている Edge ポリシーが、AuthenticatedUserId という変数を設定するとします。以下のコードは、この変数にアクセスしてログに出力します。また、このコードでは変数の設定も行われます。それにより、以下に示すように、この変数にポリシーからアクセスできるようになります。

var http = require('http');
var apigee = require('apigee-access');

http.createServer(function (request, response) {
  // The request parameter must be a request object that came from the http module
  var userId = apigee.getVariable(request, 'AuthenticatedUserId');
  apigee.setVariable(request, "custom.foo", "Bar");
  console.log('Authenticated Apigee User ID is %s', userId);
  response.writeHead(200, {'Content-Type': 'text/plain'});
  response.end('Hello World\n');
}).listen(8124);

console.log('Server running at http://127.0.0.1:8124/');

このコードは、JavaScript ファイルにコピーして Edge にデプロイすることで、試すことができます。ファイル server.js を呼び出します。このファイルをデプロイするには、以下のコマンドを使用します。

apigeetool deploynodeapp -u username -p password -o myorg -e test -n access -d . -m server.js -b /access

アプリケーションを Edge にデプロイした後に、以下のように構成された AssignMessage ポリシーを ProxyEndpoint リクエスト フローに追加します。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AssignMessage async="false" continueOnError="false" enabled="true" name="AddUserId">
    <DisplayName>AddUserId</DisplayName>
    <FaultRules/>
    <Properties/>
    <AssignVariable>
        <Name>AuthenticatedUserId</Name>
        <Value>ntesla</Value>
        <Ref/>
    </AssignVariable>
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
    <AssignTo createNew="false" transport="http" type="request"/>
</AssignMessage>

次に、別の AssignMessage ポリシーを TargetEndpoint レスポンス プレフローに接続します。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AssignMessage async="false" continueOnError="false" enabled="true" name="SetHeader">
    <DisplayName>SetHeader</DisplayName>
    <FaultRules/>
    <Properties/>
    <Set>
        <Headers>
            <Header name="MySpecialHeader">{custom.foo}</Header>
        </Headers>
    </Set>
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
    <AssignTo createNew="false" transport="http" type="request"/>
</AssignMessage>

プロキシは、以下のようにして呼び出すことができます。

curl -i http://myorg-test.apigee.net/access

次に、管理 UI でアクセス プロキシのページに移動し、[Develop] ビューを開きます。[Node.js Logs] をクリックして、プロキシからのログ出力を表示します。プロキシが適切に構成されていれば、userId 変数が設定されていることを確認できます。 また、cURL 出力にヘッダーが設定されたことをターミナル ウィンドウで確認できます。

HTTP/1.1 200 OK

Content-Type: text/plain
Date: Tue, 27 05 2014 23:20:52 GMT
MySpecialHeader: Bar
Content-Length: 12
Connection: keep-alive

メソッド


getVariable

var result = getVariable(httpRequest, name);

名前付き変数を取得します。

パラメータ:

  • httpRequest: http モジュールからのリクエスト オブジェクト。
  • name: (文字列)取得する変数の名前。

戻り値:

文字列または数値。別の場所で作成したときに setVariable() で設定された型、またはポリシーによって作成された型に応じて異なります。標準装備の Edge 変数にアクセスしようとしている場合、型の一覧については変数リファレンスをご覧ください。ポリシーによって作成される変数型については、ポリシー リファレンスのトピックをご覧ください。

例:

var apigee = require('apigee-access');
    // "httpRequest" must be a request object that came from the http module
    var val1 = apigee.getVariable(request, 'TestVariable');
    var val2 = apigee.getVariable(request, 'request.client.ip');

setVariable

setVariable(httpRequest, name, value);

変数を設定します。一部の変数は読み取り専用であるため、そのような変数を設定しようとすると setVariable() メソッドによって例外がスローされます。読み取り専用の変数を確認するには、変数リファレンスをご覧ください。

パラメータ:

  • httpRequest: http モジュールからのリクエスト オブジェクト。
  • name: (文字列)取得する変数の名前。
  • value: 数値、文字列、論理値、null、未定義値を指定できます。

例:

var apigee = require('apigee-access');
    apigee.setVariable(request, 'TestVariable', 'bar');
    // This will throw an exception because client.ip is read-only.
    apigee.setVariable(request, 'client.ip');


setIntVariable

setIntVariable(httpRequest, name, value);

setIntVariable() は、value パラメータを強制的に整数値に変換してから設定する、便利なメソッドです。

パラメータ:

  • httpRequest: http モジュールからのリクエスト オブジェクト。
  • name: (文字列)設定する変数の名前。
  • value: 文字列値か数値であることが必要です。

例:

var apigee = require('apigee-access');
// Convert "123" to an integer and set it
apigee.setIntVariable(request, 'TestVariable', '123');
// Use something that's already a number
apigee.setIntVariable(request, 'TestVariable2', 42);

deleteVariable

名前付き変数を削除します。読み取り専用変数を削除しようとすると、エラーになります。読み取り専用変数の一覧については、変数リファレンスをご覧ください。

deleteVariable(httpRequest, name);

パラメータ:

  • httpRequest: http モジュールからのリクエスト オブジェクト。
  • name: (文字列)削除する変数の名前。

例:

  apigee.deleteVariable(request, 'TestVariable');
    // This will throw an exception because client.ip is a read-only variable.
    apigee.deleteVariable(request, 'client.ip');