すべてのプロダクト
Search
ドキュメントセンター

Function Compute:イベントハンドラー

最終更新日:Aug 30, 2024

このトピックでは、イベントハンドラーの構造的な特徴について説明し、Node.jsでイベントハンドラーを使用する方法の例を示します。

イベントハンドラ署名

説明

ECMAScriptモジュールは、Node.js 18以降のFunction Computeでサポートされています。 Node.js 16以前のバージョンの場合、Function ComputeはCommonJSモジュールのみをサポートします。 詳細については、「ECMAScriptモジュールをハンドラーとして指定する」をご参照ください。

次のサンプルコードでは、イベントハンドラーの署名について説明します。

Node.js 18以降

ECMAScriptモジュール

// index.mjs
export const handler = async (event, context) => {
  console.log("event: \n" + event);
  return "Hello World!";
};

CommonJSモジュール

// index.js
exports.handler = async function(event, context) {
  console.log("event: \n" + event);
  return "Hello World!";
};

Node.js 16以前

// index.js
exports.handler = async function(event, context, callback) {
  console.log("event: \n" + event);
  callback(null, 'hello world');
};

パラメーターの説明:

handlerは、Function Computeコンソールで設定されたHandlerパラメーターの値に対応するメソッド名を示します。 たとえば、関数の作成時にHandlerindex.handlerに設定した場合、Function Computeindex.jsで定義されたhandler関数を読み込み、コードの実行を開始します。

Function Computeランタイムは、リクエストパラメーターをハンドラーに渡します。 第1のパラメータは、要求ペイロード情報を含むイベントオブジェクトである。 イベントオブジェクトはBufferタイプです。 ビジネス要件に基づいて別のオブジェクトタイプに変換できます。 2番目のパラメータは、呼び出し中にコンテキスト情報を提供するコンテキストオブジェクトです。 詳細は、「コンテキスト」をご参照ください。

説明
  • Node.js 18以降を使用する場合は、callbackの代わりにAsync/Awaitを使用することを推奨します。

  • Function Computeは、返された値の型に基づいて返された結果を変換します。

    • バッファタイプ: 結果は変換なしで返されます。

    • オブジェクトタイプ: 結果はJSON形式に変換されます。

    • その他の型: 結果は文字列として返されます。

非同期 /待ち

Node.js 18以降でAsync/Awaitを使用することを推奨します。 Async/Awaitは、ネストされたコールバックやメソッドチェーンなしでNode.jsに非同期コードを記述するためのシンプルで読みやすい方法です。

重要

Node.js 16以前を使用する場合は、コールバックを明示的に使用して応答を送信する必要があります。 それ以外の場合、要求タイムアウトエラーが発生します。

callbackと比較して、Async/Awaitは次の利点を提供します。

  • より優れた可読性: 非同期 /待機モードのコードはより線形で同期的であり、理解と保守が容易です。 高レベルの巣を防ぎ、コード構造をより明確にします。

  • 簡単なデバッグとエラー処理: try-catchブロックを使用して、非同期操作のエラーをより簡単にキャッチして処理できます。 エラースタックは簡単に見つけて追跡できます。

  • 高効率: ほとんどの場合、コールバック関数はコードの異なる部分を切り替える必要があります。 Async /Aswaitはコンテキストスイッチの数を減らすことができ、それによってコード効率が向上します。

例1: JSON形式のパラメーターの解析

サンプルコード

JSON形式のパラメーターをFunction Computeの関数に渡すと、Function Computeがパラメーターを通過し、コード内のパラメーターを解析する必要があります。 次のサンプルコードは、JSON形式のイベントを解析する方法の例を示しています。

ECMAScriptモジュール

説明

この例では、Node.js 18以降のみをサポートします。

export const handler = async (event, context) => {
  var eventObj = JSON.parse(event.toString());
  return eventObj['key'];
};

CommonJSモジュール

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

前提条件

Node.js関数が作成されます。 詳細については、「関数の作成」をご参照ください。 ECMAScriptモジュールとしてコードを指定する場合は、関数を作成するときに、ランタイムとしてNode.js 18またはNode.js 20を選択する必要があります。

手順

  1. Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[サービスと機能] をクリックします。

  2. 上部のナビゲーションバーで、リージョンを選択します。 [サービス] ページで、目的のサービスをクリックします。

  3. [関数] ページで、目的の関数の名前をクリックします。 表示される [関数の詳細] ページで、[コード] タブをクリックします。

  4. コードタブで、コードエディターに上記のサンプルコードを入力し、デプロイ をクリックします。

    説明

    上記のサンプルコードでは、ハンドラーはindex.jsまたはindex.mjshandlerメソッドです。 別のハンドラーを指定する場合は、実際のファイルとメソッドを使用します。

  5. コードタブをクリックし、隣のdownアイコンテスト機能、選択テストパラメーターの設定ドロップダウンリストから、次のテストパラメーターを設定し、OK をクリックします

    {
      "key": "value"
    }
  6. クリックテスト機能.

    関数の実行後、実行結果が返されます。 実行結果はvalueです。

例2: 一時的なAccessKeyペアを使用したOSSリソースの読み取りと書き込み

サンプルコード

Function Computeが提供する一時的なAccessKeyペアを使用して、Object Storage Service (OSS) にアクセスできます。 このセクションでは、サンプルコードを提供します。

ECMAScriptモジュール

説明

この例では、Node.js 18以降のみをサポートします。

// index.mjs
import OSSClient from 'ali-oss';

export const handler = async (event, context) => {
    console.log(event.toString());

    var ossClient = new OSSClient({
        accessKeyId: context.credentials.accessKeyId,
        accessKeySecret: context.credentials.accessKeySecret,
        stsToken: context.credentials.securityToken,
        region: 'oss-cn-shenzhen',
        bucket: 'my-bucket',
    });

    try {
      // Upload an object to OSS. object indicates the name of the object in OSS. localfile indicates the path of the on-premises file. 
      const uploadResult = await ossClient.put('myObj', Buffer.from('hello, fc', "utf-8"));
      console.log('upload success, ', uploadResult);
      return "succ"
    } catch (error) {
      throw error
    }
};

次の項目は、パラメータについて説明します。

  • context.credentials: コンテキストパラメーターから一時キーを取得します。 これは、コード内のパスワードなどの機密情報のハードコーディングを防ぐのに役立ちます。

  • myObj: OSSオブジェクトの名前。

  • Buffer.from('hello, fc', "utf-8"): アップロードされたオブジェクトコンテンツ。

  • return "succ": アップロードが成功した場合はsuccを返します。

  • throw err: アップロードが失敗した場合に例外をスローします。

CommonJSモジュール

var OSSClient = require('ali-oss');

exports.handler = function (event, context, callback) {
    console.log(event.toString());

    var ossClient = new OSSClient({
        accessKeyId: context.credentials.accessKeyId,
        accessKeySecret: context.credentials.accessKeySecret,
        stsToken: context.credentials.securityToken,
        region: 'oss-cn-shenzhen',
        bucket: 'my-bucket',
    });

    ossClient.put('myObj', Buffer.from('hello, fc', "utf-8")).then(function (res) {
        callback(null, 'succ');
    }).catch(function (err) {
        callback(err);
    });
};

次の項目は、パラメータについて説明します。

  • context.credentials: コード内のパスワードなどの機密情報のハードコーディングを回避するために、コンテキストパラメータから一時キーを取得します。

  • myObj: OSSオブジェクトの名前。

  • Buffer.from('hello, fc', "utf-8"): アップロードされたオブジェクトコンテンツ。

  • callback(null, 'put object'): アップロードが成功した場合、succを返します。

  • callback(err): アップロードが失敗した場合はErrを返します。

前提条件

  • OSSにアクセスする権限を持つロールがサービスに設定されています。 詳細については、「他のAlibaba Cloudサービスへのアクセス権限付与」をご参照ください。

  • Node.jsランタイムで実行される関数が作成されます。 詳細については、「関数の作成」をご参照ください。 ECMAScriptモジュールとしてコードを指定する場合は、関数を作成するときに、ランタイムとしてNode.js 18またはNode.js 20を選択する必要があります。

手順

  1. Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[サービスと機能] をクリックします。

  2. 上部のナビゲーションバーで、リージョンを選択します。 [サービス] ページで、目的のサービスをクリックします。

  3. [関数] ページで、目的の関数の名前をクリックします。 表示される [関数の詳細] ページで、[コード] タブをクリックします。

  4. オプションです。 [コード] タブで、ページ下部の [WebIDE] をクリックします。 WebIDEページで、[ターミナル] > [新しいターミナル] をクリックします。 次のコマンドを実行して、ターミナルにali-oss依存関係をインストールします。

    npm install ali-oss --save

    インストールが完了すると、WebIDEの左側のコードディレクトリにnode_modulesフォルダが生成されていることがわかります。 フォルダには、ali-ossディレクトリと他の依存ライブラリが含まれています。

  5. On theコードタブで、前のサンプルコードコードエディターで、コードを保存し、デプロイ.

    説明
    • 上記のサンプルコードの関数のリクエストハンドラーは、index.jsまたはindex.mjshandlerメソッドです。 別のハンドラーを指定する場合は、実際のファイルとメソッドを使用します。

    • 上記のサンプルコードでは、実際の値に基づいてregionbucketを指定します。

  6. テスト機能 をクリックします。

    関数の実行後、実行結果が返されます。 実行結果はsuccです。

例3: 外部コマンドの呼び出し

Node.jsプログラムを使用して、外部コマンドを呼び出すforkプロセスを作成できます。 たとえば、child_processモジュールを使用してls -lコマンドを呼び出すことができます。 コマンドを呼び出した後、現在のディレクトリ内のファイルが返されます。 このセクションでは、サンプルコードを提供します。

ECMAScriptモジュール

説明

この例では、Node.js 18以降のみをサポートします。

import { exec } from 'child_process';
import { promisify } from 'util';

const execPromisify = promisify(exec);
export const handler = async (event, context) => {
  try {
    const { stdout, stderr } = await execPromisify("ls -l");
    console.log(`stdout: ${stdout}`);
    if (stderr !== "") {
      console.error(`stderr: ${stderr}`);
    }
    return stdout;
  } catch (error) {
    console.error(`exec error: ${error}`);
    return error;
  }
}

CommonJSモジュール

'use strict';

var exec = require('child_process').exec;
exports.handler = (event, context, callback) => {
  console.log('start to execute a command');
  exec("ls -l", function(error, stdout, stderr){
    callback(null, stdout);
});
}