全部產品
Search
文件中心

:事件請求處理常式(Event Handler)

更新時間:Jul 06, 2024

本文介紹Node.js事件請求處理常式的結構特點和樣本。

Event Handler簽名

說明

Function Compute從Node.js 18運行時開始支援ECMAScript(ES)模組。在此之前(Node.js 16及以前的版本),Function Compute僅支援使用CommonJS 模組。詳情請參見將請求處理常式指定為ES模組

一個簡單的Event Handler簽名定義如下。

Node.js 18及以上版本

ES模組

// 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');
};

Event Handler的樣本解析如下:

handler是方法名稱,與Function Compute控制台配置的請求處理常式相對應。例如,建立函數時指定的請求處理常式index.handler,那麼Function Compute會去載入index.js中定義的handler函數,並從這裡開始執行。

Function Compute運行時會將請求參數傳遞到請求處理常式中,第一個參數是event對象,包含請求的承載資訊,event對象是Buffer類型,您可以將其轉換成所需要的物件類型。第二個參數是 context對象,提供在調用時的運行上下文資訊。更多資訊,請參見上下文

說明
  • 使用Node.js 18及以上版本的運行時環境時,建議您使用Async/Await功能,而不是使用回呼函數callback

  • Function Compute會根據傳回值的類型對返回結果做相應轉換。

    • Buffer類型:不轉換,原樣返回。

    • Object類型:轉換為JSON格式後返回。

    • 其他類型:轉換為字串後返回。

Async/Await

使用Node.js 18及以上版本的運行時環境時,建議您使用Async/Await方式來實現。Async/Await是一種簡潔、易讀的Node.js非同步代碼編寫方式,無需嵌套回調或鏈式調用。

重要

如果您使用的Node.js 16及以下版本的運行時環境,則必須顯式使用回調方法 callback發送響應,否則會出現請求逾時錯誤。

Async/Await方式與回呼函數callback相比,有以下優點:

  • 可讀性更好:Async/Await方式的代碼更加線性和同步,更易於理解和維護。它避免了回呼函數嵌套過深的情況,使代碼結構更清晰。

  • 調試和錯誤處理更簡單:可以使用try-catch塊更方便地捕獲和處理非同步作業中的錯誤,錯誤堆棧更加清晰,可以更準確地追蹤錯誤發生的位置。

  • 效率更高:回呼函數通常需要在代碼的不同部分之間切換。Async/Await方式可以減少環境切換的數量,從而提高代碼效率。

樣本一:解析JSON格式參數

範例程式碼

當您傳入JSON格式參數時,Function Compute會透傳參數內容,需要您在代碼中自行解析。下面是解析JSON格式事件的程式碼範例。

ES模組

說明

此樣本僅支援運行在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函數,具體操作,請參見建立函數。如果您需要將代碼指定為ES模組,建立函數時,運行環境需選擇Node.js 18或Node.js 20。

操作步驟

  1. 登入Function Compute控制台,在左側導覽列,單擊服務及函數
  2. 在頂部功能表列,選擇地區,然後在服務列表頁面,單擊目標服務。
  3. 函數管理頁面,單擊目標函數名稱,然後在函數詳情頁面,單擊函數代碼頁簽。
  4. 函數代碼頁簽,在代碼編輯器中輸入上述範例程式碼,然後單擊部署代碼

    說明

    上述範例程式碼中函數的請求處理常式是index.jsindex.mjs中的handler方法。如果您的函數的請求處理常式配置不同,請擷取對應的檔案和方法進行更新。

  5. 函數代碼頁簽,單擊測試函數右側的down表徵圖,從下拉式清單中選擇配置測試參數,輸入如下樣本測試參數,然後單擊確定

    {
      "key": "value"
    }
  6. 單擊測試函數

    函數執行成功後,查看返回結果,您可以看到返回結果為value

樣本二:通過臨時密鑰安全讀寫OSS的資源

範例程式碼

您可以使用Function Compute為您提供的臨時密鑰訪問Object Storage Service,程式碼範例如下所示。

ES模組

說明

此樣本僅支援運行在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 {
      // 上傳檔案到OSS,'object'是OSS中的檔案名稱,'localfile'是本地檔案的路徑。
      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:從 context 參數中擷取臨時密鑰,避免在代碼中寫入程式碼密碼等敏感資訊。

  • 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:從context參數中擷取臨時密鑰,避免在代碼中寫入程式碼密碼等敏感資訊。

  • myObj:OSS對象名。

  • Buffer.from('hello, fc', "utf-8"):上傳的對象內容。

  • callback(null, 'put object'):上傳成功正常返回"succ"。

  • callback(err):上傳失敗時異常返回err。

前提條件

操作步驟

  1. 登入Function Compute控制台,在左側導覽列,單擊服務及函數
  2. 在頂部功能表列,選擇地區,然後在服務列表頁面,單擊目標服務。
  3. 函數管理頁面,單擊目標函數名稱,然後在函數詳情頁面,單擊函數代碼頁簽。
  4. (可選)在函數代碼頁簽,在下方的WebIDE介面,依次選擇Terminal > New Terminal開啟終端,執行以下命令安裝ali-oss依賴。

    npm install ali-oss --save

    安裝完成後,在WebIDE介面左側代碼目錄可以看到產生了node_modules檔案夾,檔案夾內包含ali-oss目錄以及其他依賴庫。

  5. 函數代碼頁簽,在下面代碼編輯器中,輸入上述範例程式碼,儲存並單擊部署代碼

    說明
    • 上述範例程式碼中函數的請求處理常式是index.jsindex.mjs中的handler方法。如果您的函數的請求處理常式配置不同,請擷取對應的檔案和方法進行更新。

    • 上述範例程式碼中regionbucket需按照實際情況填寫。

  6. 單擊測試函數

    函數執行成功後,查看返回結果,您可以看到返回結果為succ

樣本三:調用外部命令

您的Node.js程式也可以建立fork進程,調用外部命令。例如,您可以使用child_process模組調用Linux的ls -l命令,輸出目前的目錄下的檔案清單。程式碼範例如下:

ES模組

說明

此樣本僅支援運行在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);
});
}