このトピックでは、イベントハンドラーの構造的な特徴について説明し、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パラメーターの値に対応するメソッド名を示します。 たとえば、関数の作成時にHandlerをindex.handler
に設定した場合、Function Computeはindex.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を選択する必要があります。
手順
Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[サービスと機能] をクリックします。
上部のナビゲーションバーで、リージョンを選択します。 [サービス] ページで、目的のサービスをクリックします。
[関数] ページで、目的の関数の名前をクリックします。 表示される [関数の詳細] ページで、[コード] タブをクリックします。
コードタブで、コードエディターに上記のサンプルコードを入力し、デプロイ をクリックします。
説明上記のサンプルコードでは、ハンドラーは
index.js
またはindex.mjs
のhandler
メソッドです。 別のハンドラーを指定する場合は、実際のファイルとメソッドを使用します。コードタブをクリックし、隣のアイコンテスト機能、選択テストパラメーターの設定ドロップダウンリストから、次のテストパラメーターを設定し、OK をクリックします
{ "key": "value" }
クリックテスト機能.
関数の実行後、実行結果が返されます。 実行結果は
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を選択する必要があります。
手順
Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[サービスと機能] をクリックします。
上部のナビゲーションバーで、リージョンを選択します。 [サービス] ページで、目的のサービスをクリックします。
[関数] ページで、目的の関数の名前をクリックします。 表示される [関数の詳細] ページで、[コード] タブをクリックします。
オプションです。 [コード] タブで、ページ下部の [WebIDE] をクリックします。 WebIDEページで、
をクリックします。 次のコマンドを実行して、ターミナルにali-oss依存関係をインストールします。npm install ali-oss --save
インストールが完了すると、WebIDEの左側のコードディレクトリに
node_modules
フォルダが生成されていることがわかります。 フォルダには、ali-oss
ディレクトリと他の依存ライブラリが含まれています。On theコードタブで、前のサンプルコードコードエディターで、コードを保存し、デプロイ.
説明上記のサンプルコードの関数のリクエストハンドラーは、
index.js
またはindex.mjs
のhandlerメソッドです。 別のハンドラーを指定する場合は、実際のファイルとメソッドを使用します。上記のサンプルコードでは、実際の値に基づいて
region
とbucket
を指定します。
テスト機能 をクリックします。
関数の実行後、実行結果が返されます。 実行結果は
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);
});
}