Azure Functions の JavaScript 開発者向けガイドAzure Functions JavaScript developer guide

Azure Functions の JavaScript エクスペリエンスを利用すると、ランタイムと通信したり、バインディングを介してデータの送受信を行ったりする場合に context オブジェクトとして渡される関数を簡単にエクスポートできます。The JavaScript experience for Azure Functions makes it easy to export a function, which is passed as a context object for communicating with the runtime and for receiving and sending data via bindings.

この記事では、「 Azure Functions developer reference (Azure Functions 開発者向けリファレンス)」を既に読んでいることを前提としています。This article assumes that you've already read the Azure Functions developer reference.

関数のエクスポートExporting a function

すべての JavaScript 関数では、ランタイムが関数を見つけて実行するために、module.exports を使用して function を 1 つエクスポートする必要があります。All JavaScript functions must export a single function via module.exports for the runtime to find the function and run it. この関数には、常に context オブジェクトを含める必要があります。This function must always include a context object.

// You must include a context, but other arguments are optional
module.exports = function(context) {
    // Additional inputs can be accessed by the arguments property
    if(arguments.length === 4) {
        context.log('This function has 4 inputs');
    }
};
// or you can include additional inputs in your arguments
module.exports = function(context, myTrigger, myInput, myOtherInput) {
    // function logic goes here :)
};

direction === "in" のバインディングが関数の引数と一緒に渡されます。つまり、arguments を使用して、新しい入力を動的に処理できます (たとえば、arguments.length を使用して、すべての入力を繰り返し処理できます)。Bindings of direction === "in" are passed along as function arguments, which means that you can use arguments to dynamically handle new inputs (for example, by using arguments.length to iterate over all your inputs). この機能は、トリガーのみがあり、追加の入力がない場合に便利です。これは、context オブジェクトを参照しなくてもトリガーのデータに予測どおりにアクセスできるためです。This functionality is convenient when you have only a trigger and no additional inputs, because you can predictably access your trigger data without referencing your context object.

引数は、exports ステートメントで順序を指定していなくても、function.jsonに出現する順序で常に関数に渡されます。The arguments are always passed along to the function in the order in which they occur in function.json, even if you don't specify them in your exports statement. たとえば、function(context, a, b) があり、それを function(context, a) に変更しても、arguments[2] を参照することで、関数コードの b の値を取得できます。For example, if you have function(context, a, b) and change it to function(context, a), you can still get the value of b in function code by referring to arguments[2].

すべてのバインディングも、方向に関係なく、context オブジェクトと一緒に渡されます (以下のスクリプトを参照)。All bindings, regardless of direction, are also passed along on the context object (see the following script).

context オブジェクトcontext object

ランタイムでは、context オブジェクトを使用して、関数との間でデータをやり取りし、ユーザーがランタイムと通信できるようにします。The runtime uses a context object to pass data to and from your function and to let you communicate with the runtime.

context オブジェクトは、常に関数の最初のパラメーターとし、必ず含める必要があります。context オブジェクトには、ランタイムを適切に使用するのに必要な context.donecontext.log などのメソッドが用意されているためです。The context object is always the first parameter to a function and must be included because it has methods such as context.done and context.log, which are required to use the runtime correctly. オブジェクトには、任意の名前 (ctxc など) を付けることができます。You can name the object whatever you would like (for example, ctx or c).

// You must include a context, but other arguments are optional
module.exports = function(context) {
    // function logic goes here :)
};

context.bindings プロパティcontext.bindings property

context.bindings

すべての入力データと出力データを含む名前付きオブジェクトを返します。Returns a named object that contains all your input and output data. たとえば、function.json に次のバインディング定義が含まれている場合は、context.bindings.myInput オブジェクトからキューの内容にアクセスできます。For example, the following binding definition in your function.json lets you access the contents of the queue from the context.bindings.myInput object.

{
    "type":"queue",
    "direction":"in",
    "name":"myInput"
    ...
}
// myInput contains the input data, which may have properties such as "name"
var author = context.bindings.myInput.name;
// Similarly, you can set your output data
context.bindings.myOutput = { 
        some_text: 'hello world', 
        a_number: 1 };

context.done メソッドcontext.done method

context.done([err],[propertyBag])

コードが完了したことをランタイムに通知します。Informs the runtime that your code has finished. ユーザーは context.done を呼び出す必要があります。そうしないと、ランタイムに関数の完了が通知されず、実行がタイムアウトになります。You must call context.done, or else the runtime never knows that your function is complete, and the execution will time out.

context.done メソッドを使用すると、ユーザー定義のエラーに加えて、context.bindings オブジェクトのプロパティを上書きするプロパティのプロパティ バッグをランタイムに渡すことができます。The context.done method allows you to pass back both a user-defined error to the runtime and a property bag of properties that overwrite the properties on the context.bindings object.

// Even though we set myOutput to have:
//  -> text: hello world, number: 123
context.bindings.myOutput = { text: 'hello world', number: 123 };
// If we pass an object to the done function...
context.done(null, { myOutput: { text: 'hello there, world', noNumber: true }});
// the done method will overwrite the myOutput binding to be: 
//  -> text: hello there, world, noNumber: true

context.log メソッドcontext.log method

context.log(message)

既定のトレース レベルでストリーミング コンソール ログに書き込むことができます。Allows you to write to the streaming console logs at the default trace level. context.log で利用可能な、他のトレース レベルでコンソール ログに書き込むことができるログ記録方法が他にあります。On context.log, additional logging methods are available that let you write to the console log at other trace levels:

メソッドMethod DescriptionDescription
error(message)error(message) エラー レベルのログ、またはそれ以下に書き込みます。Writes to error level logging, or lower.
warn(message)warn(message) 警告レベルのログ、またはそれ以下に書き込みます。Writes to warning level logging, or lower.
info(message)info(message) 情報レベルのログ、またはそれ以下に書き込みます。Writes to info level logging, or lower.
verbose(message)verbose(message) 詳細なレベルのログに書き込みます。Writes to verbose level logging.

次の例は、警告トレース レベルでコンソールに書き込みます。The following example writes to the console at the warning trace level:

context.log.warn("Something has happened."); 

host.json ファイルにログを記録する場合のトレース レベルのしきい値を設定したり、それを無効にしたりできます。You can set the trace-level threshold for logging in the host.json file, or turn it off. ログに書き込む方法の詳細については、次のセクションを参照してください。For more information about how to write to the logs, see the next section.

バインド データ型Binding data type

入力バインドのデータ型を定義するには、バインド定義の dataType プロパティを使用します。To define the data type for an input binding, use the dataType property in the binding definition. たとえば、バイナリ形式で HTTP 要求のコンテンツを読み取るには、binary 型を使用します。For example, to read the content of an HTTP request in binary format, use the type binary:

{
    "type": "httpTrigger",
    "name": "req",
    "direction": "in",
    "dataType": "binary"
}

dataType のその他のオプションは、streamstring です。Other options for dataType are stream and string.

トレース出力をコンソールに書き込むWriting trace output to the console

関数で、context.log メソッドを使用してトレース出力をコンソールに書き込みます。In Functions, you use the context.log methods to write trace output to the console. この時点では、console.log を使用してコンソールに書き込むことはできません。At this point, you cannot use console.log to write to the console.

context.log() を呼び出すと、既定のトレース レベルである、情報 トレース レベルでコンソールにメッセージが書き込まれます。When you call context.log(), your message is written to the console at the default trace level, which is the info trace level. 次のコードは、情報トレース レベルでコンソールに書き込みます。The following code writes to the console at the info trace level:

context.log({hello: 'world'});  

上記のコードは次のコードと同等です。The preceding code is equivalent to the following code:

context.log.info({hello: 'world'});  

次のコードは、エラー レベルでコンソールに書き込みます。The following code writes to the console at the error level:

context.log.error("An error has occurred.");  

エラー は最高のトレース レベルであるため、ログ記録が有効になっている限り、このトレースはすべてのトレース レベルで出力に書き込まれます。Because error is the highest trace level, this trace is written to the output at all trace levels as long as logging is enabled.

すべての context.log メソッドは、Node.js の util.format メソッドでサポートされているのと同じパラメーター形式をサポートしています。All context.log methods support the same parameter format that's supported by the Node.js util.format method. 既定のトレース レベルを使用してコンソールに出力する次のコードについて検討してください。Consider the following code, which writes to the console by using the default trace level:

context.log('Node.js HTTP trigger function processed a request. RequestUri=' + req.originalUrl);
context.log('Request Headers = ' + JSON.stringify(req.headers));

同じコードを次の形式で記述することもできます。You can also write the same code in the following format:

context.log('Node.js HTTP trigger function processed a request. RequestUri=%s', req.originalUrl);
context.log('Request Headers = ', JSON.stringify(req.headers));

コンソール ログのトレース レベルを構成するConfigure the trace level for console logging

関数を使用して、コンソールに書き込むためのしきい値のトレース レベルを定義できます。これによって、関数からコンソールにトレースを書き込む方法を簡単に制御できます。Functions lets you define the threshold trace level for writing to the console, which makes it easy to control the way traces are written to the console from your functions. コンソールに書き込まれるすべてのトレースのしきい値を設定するには、host.json ファイルの tracing.consoleLevel プロパティを使用します。To set the threshold for all traces written to the console, use the tracing.consoleLevel property in the host.json file. この設定は、関数アプリのすべての関数に適用されます。This setting applies to all functions in your function app. 次の例では、詳細ログ記録が有効になるようにトレースのしきい値を設定します。The following example sets the trace threshold to enable verbose logging:

{ 
    "tracing": {      
        "consoleLevel": "verbose"     
    }
}  

consoleLevel の値は、context.log メソッドの名前に対応します。Values of consoleLevel correspond to the names of the context.log methods. コンソールへのすべてのトレース ログ記録を無効にするには、consoleLeveloff に設定します。To disable all trace logging to the console, set consoleLevel to off. 詳細については、host.json のリファレンスを参照してください。For more information, see host.json reference.

HTTP トリガーとバインディングHTTP triggers and bindings

HTTP、webhook トリガー、および HTTP 出力バインディングでは、要求オブジェクトと応答オブジェクトを使用して HTTP メッセージングを表します。HTTP and webhook triggers and HTTP output bindings use request and response objects to represent the HTTP messaging.

要求オブジェクトRequest object

request オブジェクトには、次のプロパティがあります。The request object has the following properties:

プロパティProperty 説明Description
bodybody 要求の本文を格納するオブジェクト。An object that contains the body of the request.
headersheaders 要求ヘッダーを格納するオブジェクト。An object that contains the request headers.
methodmethod 要求の HTTP メソッド。The HTTP method of the request.
originalUrloriginalUrl 要求の URL。The URL of the request.
paramsparams 要求のルーティング パラメーターを格納するオブジェクト。An object that contains the routing parameters of the request.
queryquery クエリ パラメーターを格納するオブジェクト。An object that contains the query parameters.
rawBodyrawBody 文字列としてのメッセージの本文。The body of the message as a string.

応答オブジェクトResponse object

response オブジェクトには、次のプロパティがあります。The response object has the following properties:

プロパティProperty 説明Description
bodybody 応答の本文を格納するオブジェクト。An object that contains the body of the response.
headersheaders 応答ヘッダーを格納するオブジェクト。An object that contains the response headers.
isRawisRaw 応答の書式設定をスキップすることを示します。Indicates that formatting is skipped for the response.
状態status 応答の HTTP 状態コード。The HTTP status code of the response.

要求と応答へのアクセスAccessing the request and response

HTTP トリガーを使用する場合、HTTP 要求オブジェクトと応答オブジェクトにアクセスする方法は 3 つあります。When you work with HTTP triggers, you can access the HTTP request and response objects in any of three ways:

  • 名前付きの入力バインディングと出力バインディングから。From the named input and output bindings. この方法で、HTTP トリガーとバインディングは他のバインディングと同じように動作します。In this way, the HTTP trigger and bindings work the same as any other binding. 次の例では、名前付き response バインディングを使用して、応答オブジェクトを設定します。The following example sets the response object by using a named response binding:

    context.bindings.response = { status: 201, body: "Insert succeeded." };
    
  • context オブジェクトの req プロパティと res プロパティから。From req and res properties on the context object. この方法で、完全な context.bindings.name パターンを使用する代わりに、従来のパターンを使用して context オブジェクトから HTTP データにアクセスできます。In this way, you can use the conventional pattern to access HTTP data from the context object, instead of having to use the full context.bindings.name pattern. 次の例では、contextreq オブジェクトと res オブジェクトにアクセスする方法を示します。The following example shows how to access the req and res objects on the context:

    // You can access your http request off the context ...
    if(context.req.body.emoji === ':pizza:') context.log('Yay!');
    // and also set your http response
    context.res = { status: 202, body: 'You successfully ordered more coffee!' }; 
    
  • context.done() の呼び出しで。By calling context.done(). これは、context.done() メソッドに渡される応答を返す特殊な種類の HTTP バインディングです。A special kind of HTTP binding returns the response that is passed to the context.done() method. 次の HTTP 出力バインディングで、$return 出力パラメーターを定義します。The following HTTP output binding defines a $return output parameter:

    {
      "type": "http",
      "direction": "out",
      "name": "$return"
    }
    

    この出力バインディングでは、次のように done() を呼び出すときにユーザーに応答を返すことを想定しています。This output binding expects you to supply the response when you call done(), as follows:

     // Define a valid response object.
    res = { status: 201, body: "Insert succeeded." };
    context.done(null, res);   
    

Node のバージョンとパッケージの管理Node version and package management

Node のバージョンは、現在、 6.5.0にロックされています。The node version is currently locked at 6.5.0. 現在、さまざまなバージョンのサポートを追加して構成できるようにするために、調査しています。We're investigating adding support for more versions and making it configurable.

次の手順で、関数アプリにパッケージを含めることができます。The following steps let you include packages in your function app:

  1. https://<function_app_name>.scm.azurewebsites.net にアクセスします。Go to https://<function_app_name>.scm.azurewebsites.net.

  2. [デバッグ コンソール] > [CMD] をクリックします。Click Debug Console > CMD.

  3. D:\home\site\wwwroot に移動し、ページの上半分にある wwwroot フォルダーに package.json ファイルをドラッグします。Go to D:\home\site\wwwroot, and then drag your package.json file to the wwwroot folder at the top half of the page.
    関数アプリにファイルをアップロードする方法は、他にもあります。You can upload files to your function app in other ways also. 詳細については、「関数アプリ ファイルを更新する方法」を参照してください。For more information, see How to update function app files.

  4. package.json ファイルがアップロードされたら、Kudu リモート実行コンソールnpm install コマンドを実行します。After the package.json file is uploaded, run the npm install command in the Kudu remote execution console.
    この操作によって、package.json ファイルに示されているパッケージがダウンロードされ、関数アプリが再起動されます。This action downloads the packages indicated in the package.json file and restarts the function app.

必要なパッケージがインストールされたら、次の例に示すように require('packagename') を呼び出すことで、インストールされたパッケージを関数にインポートします。After the packages you need are installed, you import them to your function by calling require('packagename'), as in the following example:

// Import the underscore.js library
var _ = require('underscore');
var version = process.version; // version === 'v6.5.0'

module.exports = function(context) {
    // Using our imported underscore.js library
    var matched_names = _
        .where(context.bindings.myInput.names, {first: 'Carla'});

関数アプリのルートに package.json ファイルを定義する必要があります。You should define a package.json file at the root of your function app. このファイルを定義することによって、アプリのすべての関数を同じキャッシュされたパッケージで共有し、最高クラスのパフォーマンスを得ることができます。Defining the file lets all functions in the app share the same cached packages, which gives the best performance. バージョンの競合がある場合は、個別の関数のフォルダーに package.json ファイルを追加することで競合を解決できます。If a version conflict arises, you can resolve it by adding a package.json file in the folder of a specific function.

環境変数Environment variables

環境変数またはアプリ設定値を取得するには、次のコード例のように、 process.envを使用します。To get an environment variable or an app setting value, use process.env, as shown in the following code example:

module.exports = function (context, myTimer) {
    var timeStamp = new Date().toISOString();

    context.log('Node.js timer trigger function ran!', timeStamp);   
    context.log(GetEnvironmentVariable("AzureWebJobsStorage"));
    context.log(GetEnvironmentVariable("WEBSITE_SITE_NAME"));

    context.done();
};

function GetEnvironmentVariable(name)
{
    return name + ": " + process.env[name];
}

JavaScript 関数に関する考慮事項Considerations for JavaScript functions

JavaScript 関数を使用するときは、以下の 2 つのセクションに記載されている事柄に注意する必要があります。When you work with JavaScript functions, be aware of the considerations in the following two sections.

シングル vCPU App Service プランを選択するChoose single-vCPU App Service plans

App Service プランを使用する関数アプリを作成するときは、複数の vCPU を持つプランではなく、シングル vCPU プランを選択することをお勧めします。When you create a function app that uses the App Service plan, we recommend that you select a single-vCPU plan rather than a plan with multiple vCPUs. 今日では、関数を使用して、シングル vCPU VM で JavaScript 関数をより効率的に実行できるようになりました。そのため、大規模な VM を使用しても、期待以上にパフォーマンスが向上することはありません。Today, Functions runs JavaScript functions more efficiently on single-vCPU VMs, and using larger VMs does not produce the expected performance improvements. 必要な場合は、シングル vCPU VM インスタンスを追加することで手動でスケールアウトするか、自動スケールを有効にすることができます。When necessary, you can manually scale out by adding more single-vCPU VM instances, or you can enable auto-scale. 詳細については、「手動または自動によるインスタンス数のスケール変更」を参照してください。For more information, see Scale instance count manually or automatically.

TypeScript と CoffeeScript のサポートTypeScript and CoffeeScript support

ランタイムによる TypeScript/CoffeeScript の自動コンパイルはまだ直接サポートされていません。そのため、デプロイ時にランタイムの外部ですべて処理する必要があります。Because direct support does not yet exist for auto-compiling TypeScript or CoffeeScript via the runtime, such support needs to be handled outside the runtime, at deployment time.

次のステップNext steps

詳細については、次のリソースを参照してください。For more information, see the following resources: