本文介紹Node.js事件請求處理程序的結構特點和示例。
Event Handler簽名
函數計算從Node.js 18運行時開始支持ECMAScript(ES)模塊。在此之前(Node.js 16及以前的版本),函數計算僅支持使用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
是方法名稱,與函數計算控制臺配置的請求處理程序相對應。例如,創建函數時指定的請求處理程序為index.handler
,那么函數計算會去加載index.js
中定義的handler
函數,并從這里開始執行。
函數計算運行時會將請求參數傳遞到請求處理程序中,第一個參數是event
對象,包含請求的有效負載信息,event
對象是Buffer類型,您可以將其轉換成所需要的對象類型。第二個參數是 context
對象,提供在調用時的運行上下文信息。更多信息,請參見上下文。
使用Node.js 18及以上版本的運行時環境時,建議您使用Async/Await功能,而不是使用回調函數
callback
。函數計算會根據返回值的類型對返回結果做相應轉換。
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格式參數時,函數計算會透傳參數內容,需要您在代碼中自行解析。下面是解析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。
操作步驟
- 登錄函數計算控制臺,在左側導航欄,單擊服務及函數。
- 在頂部菜單欄,選擇地域,然后在服務列表頁面,單擊目標服務。
- 在函數管理頁面,單擊目標函數名稱,然后在函數詳情頁面,單擊函數代碼頁簽。
在函數代碼頁簽,在代碼編輯器中輸入上述示例代碼,然后單擊部署代碼。
說明上述示例代碼中函數的請求處理程序是
index.js
或index.mjs
中的handler
方法。如果您的函數的請求處理程序配置不同,請獲取對應的文件和方法進行更新。在函數代碼頁簽,單擊測試函數右側的圖標,從下拉列表中選擇配置測試參數,輸入如下示例測試參數,然后單擊確定。
{ "key": "value" }
單擊測試函數。
函數執行成功后,查看返回結果,您可以看到返回結果為
value
。
示例二:通過臨時密鑰安全讀寫OSS的資源
示例代碼
您可以使用函數計算為您提供的臨時密鑰訪問對象存儲OSS,代碼示例如下所示。
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。
前提條件
為服務配置具有訪問對象存儲OSS的權限的角色。具體操作,請參見授予函數計算訪問其他云服務的權限。
創建運行環境為Node.js的函數。具體操作,請參見創建函數。如果您需要將代碼指定為ES模塊,創建函數時,運行環境需選擇Node.js 18或Node.js 20。
操作步驟
- 登錄函數計算控制臺,在左側導航欄,單擊服務及函數。
- 在頂部菜單欄,選擇地域,然后在服務列表頁面,單擊目標服務。
- 在函數管理頁面,單擊目標函數名稱,然后在函數詳情頁面,單擊函數代碼頁簽。
(可選)在函數代碼頁簽,在下方的WebIDE界面,依次選擇
打開終端,執行以下命令安裝ali-oss依賴。npm install ali-oss --save
安裝完成后,在WebIDE界面左側代碼目錄可以看到生成了
node_modules
文件夾,文件夾內包含ali-oss
目錄以及其他依賴庫。在函數代碼頁簽,在下面代碼編輯器中,輸入上述示例代碼,保存并單擊部署代碼。
說明上述示例代碼中函數的請求處理程序是
index.js
或index.mjs
中的handler方法。如果您的函數的請求處理程序配置不同,請獲取對應的文件和方法進行更新。上述示例代碼中
region
和bucket
需按照實際情況填寫。
單擊測試函數。
函數執行成功后,查看返回結果,您可以看到返回結果為
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);
});
}