edit-icon download-icon

Node.js ハンドラ

最終更新日: Feb 19, 2019

Function Compute で Node.js を使用するには、Node.js 関数をハンドラとして定義する必要があります。現在、Node.js ランタイム環境では、共通ハンドラまたは HTTP トリガーハンドラをサポートしています。HTTP トリガーを使用すると、HTTP リクエストをより効率的に処理できます。HTTPトリガーハンドラを除き、他の Node.js でコーディングされた関数ハンドラーはすべて共通ハンドラを使います。Node.js ランタイム環境の詳細については、「Node.js ランタイム環境」をご参照ください。

内容

このトピックでは、共通ハンドラと HTTP トリガーハンドラについて説明します。

共通ハンドラ

関数は次のように定義されます。

  1. exports.handler = function(event, context, callback) {
  2. callback(null, 'hello world');
  3. };

関数名

exports.handler は、関数の作成時に提供される “handler” フィールドと一致しなければなりません。たとえば、ハンドラが index.handler として指定されている場合、Function Compute はindex.js ファイルで定義された handler 関数を取得します。

event パラメーター

  • event パラメーターは、関数を呼び出すときに定義されます。このパラメーターは Buffer 型で、関数の入力パラメーターです。

  • event パラメーターは、関数によって定義されていません。関数に渡されると、event は Buffer 型になります。このパラメーターは必要に応じて変換できます。たとえば、JSON 文字列が渡された場合、パラメーターを object に変換できます。渡された event の例:

    1. {
    2. "key": "value"
    3. }

    関数コード:

    1. exports.handler = function(event, context, callback) {
    2. var eventObj = JSON.parse(event.toString());
    3. callback(null, eventObj['key']);
    4. };

    value パラメーターが返されます。

context パラメーター

  • context パラメータには、 リクエスト ID や一時セキュリティトークンなど、関数の実行時に生成される情報が含まれます。コーディングの際に、生成された情報を使用できます。このパラメーターは object 型です。

  • context パラメーターは、次のように定義できます。

  1. {
  2. 'requestId': 'b1c5100f-819d-c421-3a5e-7782a27d8a33',
  3. 'credentials': {
  4. 'accessKeyId': 'STS.access_key_id',
  5. 'accessKeySecret': 'access_key_secret',
  6. 'securityToken': 'security_token',
  7. },
  8. 'function': {
  9. 'name': 'my-func',
  10. 'handler': 'index.handler',
  11. 'memory': 128,
  12. 'timeout': 10,
  13. },
  14. 'service': {
  15. 'name': 'my-service',
  16. 'logProject': 'my-log-project',
  17. 'logStore': 'my-log-store',
  18. },
  19. 'region': 'cn-shanghai',
  20. 'accountId': '123456'
  21. }

上記の関数の主要パラメーターは、次のとおりです。

  • requestId: この呼び出しの一意の ID です。例外が発生した場合のトラブルシューティングを容易にするため、このパラメータをメモしておいてください。
  • function:この関数に関する基本情報 (関数名、ハンドラ、関数メモリ、タイムアウト時間など) です。
  • credentials:Function Compute がサービスロールを想定して取得する、一時セキュリティ認証情報です。これらの認証情報は、生成されてから 6 時間に失効します。このパラメーターを使用して、OSS などの特定のサービスにアクセスできます。これにより、AccessKey が関数コードにハードコーディングで書き込まれることを防ぎます。
  • service:現在の関数が提供するサービスの詳細を指定します。たとえば、このパラメーターにはサービス名、ログプロジェクト、Log Service の Logstore などが含まれます。
  • region:cn-shanghai など、この関数が適用されるリージョンです。
  • accountId:Alibaba Cloud アカウントの ID です。

次のコードでは、OSS にファイルを送信するために Security Token Service (STS) が使用されています。

  1. var OSSClient = require('ali-oss').Wrapper;
  2. exports.handler = function (event, context, callback) {
  3. console.log(event.toString());
  4. var ossClient = new OSSClient({
  5. accessKeyId: context.credentials.accessKeyId,
  6. accessKeySecret: context.credentials.accessKeySecret,
  7. stsToken: context.credentials.securityToken,
  8. region: 'oss-cn-shanghai',
  9. bucket: 'my-bucket',
  10. });
  11. ossClient.put('my-object', new Buffer('hello, fc')).then(function (res) {
  12. callback(null, 'put object');
  13. }).catch(function (err) {
  14. callback(err);
  15. });
  16. };

注意:STS を使用して OSS にアクセスできるように、一時セキュリティトークンを発行する必要があります。

callback パラメーター

  • callback パラメーターは、呼び出された関数の結果を返すために使用されます。パラメーターシグネチャは、 function(err, data) です。Node.js 関数のほとんどの callback と同様に、callback の最初のパラメーターは error で、2 番目のパラメーターは data です。callback が呼び出されたときに err パラメーターが空でない場合、 HandledInvocationError が返されます。それ以外の場合は、データの値が返されます。データが Buffer 型の場合、結果は直ちに返されます。データが object 型の場合、結果は変換後に返されます。データが他の型の場合、結果は文字列に変換されてから返されます。

HTTP トリガーハンドラ

注意:HTTP トリガーハンドラは、共通ハンドラとは異なります。

  1. function(request, response, context)

上記の関数では、context パラメーターは、共通ハンドラの context と同じです。

request パラメーター

  • headers:map 型で、HTTP クライアントからのキーと値のペアの格納に使用されます。
  • path:string 型で、HTTP クライアントの URL を指定します。
  • queries:map 型で、HTTP クライアントの URL からのクエリリクエストのキーと値のペアを格納するために使用されます。パラメーター値は、文字列または配列です。
  • method:string 型で、HTTP メソッドが使用されます。
  • clientIP:string 型で、クライアントの IP アドレスを指定します。
  • url:string 型で、リクエストの URL を指定します 。

HTTP body の取得:HTTP トリガーハンドラのリクエストパラメーターは、HTTP リクエストと互換性があります。body フィールドは用意されていません。HTTP リクエストを使用して、 HTTP body を取得できます。

  1. // 詳細については、次の例をご参照ください。
  2. var getRawBody = require('raw-body')
  3. getRawBody(request, function(err, data){
  4. var body = data
  5. })

注意:headers パラメーターのキーに、次のフィールドが含まれている場合、このキーは無視されます。これは、Function Compute がデフォルトで次のフィールドを提供するためです。ユーザー定義フィールドはサポートしていません。x-fc- で始まるキーも無視されます。

  • accept-encoding
  • connection
  • keep-alive
  • proxy-authorization
  • te
  • trailer
  • transfer-encoding

レスポンスで提供されるメソッド

  • response.setStatusCode(statusCode): status code を設定します。
    • param statusCode: (required, type integer)
  • response.setHeader(headerKey, headerValue): header を設定します。
    • paramheaderKey: (required, type string)
    • paramheaderValue: (required, type string)
  • response.deleteHeader(headerKey): header を削除します。
    • paramheaderKey: (required, type string)
  • response.send(body): body を送信します。
    • parambody: (required, typeBuffer or a string or a stream.Readable )

注意: headers パラメーターのキーに、次のフィールドが含まれている場合、このキーは無視されます。これは、Function Compute がデフォルトで次のフィールドを提供するためです。ユーザー定義フィールドはサポートしていません。x-fc- で始まるキーも無視されます。

  • connection
  • content-length
  • content-encoding
  • date
  • keep-alive
  • proxy-authenticate
  • server
  • trailer
  • transfer-encoding
  • upgrade

制限事項

リクエストの制限事項

リクエストが次の制限を超えると、 400 ステータスコードおよび InvalidArgument エラーコードが表示されます。

  • headers サイズ:headers パラメーターのすべてのキーと値のサイズは 4 KB を超えることはできません。
  • path サイズ:path のサイズは、すべての query パラメーターのサイズに等しく、4 KB を超えることはできません。
  • body サイズ:HTTP リクエストの body サイズは、 6 MB を超えることはできません。

レスポンスの制限事項

レスポンスが以下の制限を超えると、 502 ステータスコードおよび BadResponse エラーコードが表示されます。

  • headers サイズ:headers パラメーターのすべてのキーと値のサイズは 4 KB を超えることはできません。
  • body サイズ:HTTP レスポンスの body サイズは、 6 MB を超えることはできません。