Bagian ini menjelaskan karakteristik struktural dari penangan peristiwa serta memberikan contoh penggunaannya dalam Node.js.
Signature Penangan Peristiwa
Modul ECMAScript didukung oleh Function Compute pada Node.js 18 ke atas. Untuk Node.js 16 dan versi sebelumnya, Function Compute hanya mendukung modul CommonJS. Untuk informasi lebih lanjut, lihat Tentukan modul ECMAScript sebagai handler.
Berikut adalah contoh signature untuk penangan peristiwa:
Node.js 18 dan yang lebih baru
Modul ECMAScript
// index.mjs
export const handler = async (event, context) => {
console.log("event: \n" + event);
return "Hello World!";
};
Modul CommonJS
// index.js
exports.handler = async function(event, context) {
console.log("event: \n" + event);
return "Hello World!";
};
Node.js 16 dan yang lebih lama
// index.js
exports.handler = async function(event, context, callback) {
console.log("event: \n" + event);
callback(null, 'hello world');
};
Deskripsi parameter:
handler mengacu pada nama metode yang sesuai dengan nilai parameter Handler yang dikonfigurasi di Konsol Function Compute. Sebagai contoh, jika Anda mengatur Handler menjadi index.handler saat membuat fungsi, Function Compute akan memuat fungsi handler yang didefinisikan di index.js dan mulai menjalankan kode.
Function Compute runtime melewatkan parameter permintaan ke handler. Parameter pertama adalah objek event, yang berisi informasi payload permintaan. Objek event bertipe Buffer. Anda dapat mengubahnya menjadi tipe objek lain berdasarkan kebutuhan bisnis Anda. Parameter kedua adalah objek context yang menyediakan informasi konteks selama pemanggilan. Untuk informasi lebih lanjut, lihat Context.
Kami merekomendasikan penggunaan Async/Await dibandingkan
callbackjika Anda menggunakan Node.js 18 atau yang lebih baru.Function Compute mengonversi hasil berdasarkan jenis nilai yang dikembalikan.
Tipe Buffer: Hasil dikembalikan tanpa konversi.
Tipe Objek: Hasil dikonversi ke format JSON.
Tipe lainnya: Hasil dikembalikan sebagai string.
Async/Await
Kami merekomendasikan penggunaan Async/Await pada Node.js 18 atau yang lebih baru. Async/Await merupakan cara sederhana dan mudah dibaca untuk menulis kode asinkron tanpa callback bersarang atau penggabungan metode.
Jika Anda menggunakan Node.js 16 atau yang lebih lama, Anda harus secara eksplisit menggunakan callback untuk mengirim respons. Jika tidak, terjadi kesalahan timeout permintaan.
Dibandingkan dengan callback, Async/Await memiliki beberapa keunggulan berikut:
Keterbacaan yang lebih baik: Kode dalam mode Async/Await lebih linier dan sinkron, sehingga lebih mudah dipahami dan dipelihara. Ini juga mencegah sarang tingkat tinggi dan membuat struktur kode lebih jelas.
Mudah untuk debugging dan menangani kesalahan: Anda dapat menggunakan blok try-catch untuk menangkap dan menangani kesalahan dalam operasi asinkron dengan lebih mudah. Stack kesalahan dapat dilacak dan ditelusuri dengan lebih efektif.
Efisiensi yang lebih tinggi: Dalam banyak kasus, fungsi callback memerlukan pergantian antara bagian-bagian kode yang berbeda. Async/Await dapat mengurangi jumlah pergantian konteks, sehingga meningkatkan efisiensi kode.
Contoh 1: Mengurai parameter berformat JSON
Sample code
Saat Anda melewati parameter berformat JSON ke fungsi Function Compute, Function Compute meneruskan parameter tersebut, dan Anda perlu mengurai parameter dalam kode. Berikut adalah contoh cara mengurai peristiwa berformat JSON.
Modul ECMAScript
Contoh ini hanya mendukung Node.js 18 atau yang lebih baru.
export const handler = async (event, context) => {
var eventObj = JSON.parse(event.toString());
return eventObj['key'];
};
Modul CommonJS
exports.handler = function(event, context, callback) {
var eventObj = JSON.parse(event.toString());
callback(null, eventObj['key']);
};
Prerequisites
Fungsi Node.js telah dibuat. Untuk informasi lebih lanjut, lihat Buat fungsi. Jika Anda ingin menentukan kode sebagai modul ECMAScript, pilih Node.js 18 atau Node.js 20 sebagai runtime saat membuat fungsi.
Procedure
Masuk ke Konsol Function Compute. Di panel navigasi kiri, klik Services & Functions.
Di bilah navigasi atas, pilih wilayah. Pada halaman Services, klik layanan yang diinginkan.
Pada halaman Functions, klik nama fungsi yang diinginkan. Pada halaman Detail Fungsi yang muncul, klik tab Code.
Pada tab Code, masukkan kode sampel di atas di editor kode dan klik Deploy.
CatatanPada kode sampel di atas, handler adalah metode
handlerdiindex.jsatauindex.mjs. Jika Anda menentukan handler yang berbeda, gunakan file dan metode aktual.Pada tab Code, klik ikon
di sebelah Test Function, pilih Configure Test Parameters dari daftar drop-down, konfigurasikan parameter uji berikut, lalu klik OK. { "key": "value" }Klik Test Function.
Setelah fungsi dieksekusi, hasil eksekusi dikembalikan. Hasil eksekusi adalah
value.
Contoh 2: Membaca dan menulis sumber daya OSS menggunakan pasangan AccessKey sementara
Sample code
Anda dapat menggunakan pasangan AccessKey sementara yang disediakan oleh Function Compute untuk mengakses Object Storage Service (OSS). Bagian ini menyertakan kode sampel.
Modul ECMAScript
Contoh ini hanya mendukung Node.js 18 atau yang lebih baru.
// 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 {
// Unggah objek ke OSS. object menunjukkan nama objek di OSS. localfile menunjukkan jalur file lokal.
const uploadResult = await ossClient.put('myObj', Buffer.from('hello, fc', "utf-8"));
console.log('upload berhasil, ', uploadResult);
return "succ"
} catch (error) {
throw error
}
};
Berikut adalah deskripsi parameter:
context.credentials: Mendapatkan kunci sementara dari parameter konteks. Ini membantu mencegah hard-coding informasi sensitif seperti kata sandi dalam kode.myObj: Nama objek OSS.Buffer.from('hello, fc', "utf-8"): Konten objek yang diunggah.return "succ": Mengembalikan succ jika unggah berhasil.throw err: Melempar pengecualian jika unggah gagal.
Modul 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);
});
};
Berikut adalah deskripsi parameter:
context.credentials: Mendapatkan kunci sementara dari parameter konteks untuk menghindari hard-coding informasi sensitif seperti kata sandi dalam kode.myObj: Nama objek OSS.Buffer.from('hello, fc', "utf-8"): Konten objek yang diunggah.callback(null, 'put object'): Mengembalikan succ jika unggah berhasil.callback(err): Mengembalikan Err jika unggah gagal.
Prerequisites
Peran yang memiliki izin untuk mengakses OSS dikonfigurasi untuk layanan. Untuk informasi lebih lanjut, lihat Berikan izin Function Compute untuk mengakses layanan Alibaba Cloud lainnya.
Fungsi yang berjalan di runtime Node.js telah dibuat. Untuk informasi lebih lanjut, lihat Buat fungsi. Jika Anda ingin menentukan kode sebagai modul ECMAScript, Anda harus memilih Node.js 18 atau Node.js 20 sebagai runtime saat membuat fungsi.
Procedure
Masuk ke Konsol Function Compute. Di panel navigasi kiri, klik Services & Functions.
Di bilah navigasi atas, pilih wilayah. Pada halaman Services, klik layanan yang diinginkan.
Pada halaman Functions, klik nama fungsi yang diinginkan. Pada halaman Detail Fungsi yang muncul, klik tab Code.
Opsional. Pada tab Code, klik WebIDE di bagian bawah halaman. Pada halaman WebIDE, klik . Jalankan perintah berikut untuk menginstal dependensi ali-oss di terminal:
npm install ali-oss --saveSetelah instalasi selesai, folder
node_modulesakan muncul di direktori kode di sisi kiri WebIDE. Folder tersebut berisi direktoriali-ossdan pustaka dependen lainnya.Pada tab Code, masukkan kode sampel di atas di editor kode, simpan kode, lalu klik Deploy.
CatatanRequest handler dari fungsi dalam kode sampel di atas adalah metode handler di
index.jsatauindex.mjs. Jika Anda menentukan handler yang berbeda, gunakan file dan metode aktual.Dalam kode sampel di atas, tentukan
regiondanbucketberdasarkan nilai aktual.
Klik Test Function.
Setelah fungsi dieksekusi, hasil eksekusi dikembalikan. Hasil eksekusi adalah
succ.
Contoh 3: Memanggil perintah eksternal
Anda dapat menggunakan program Node.js untuk membuat proses fork guna memanggil perintah eksternal. Sebagai contoh, Anda dapat menggunakan modul child_process untuk memanggil perintah ls -l. Setelah memanggil perintah tersebut, file di direktori saat ini akan dikembalikan. Bagian ini menyertakan kode sampel.
Modul ECMAScript
Contoh ini hanya mendukung Node.js 18 atau yang lebih baru.
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;
}
}
Modul CommonJS
'use strict';
var exec = require('child_process').exec;
exports.handler = (event, context, callback) => {
console.log('mulai mengeksekusi perintah');
exec("ls -l", function(error, stdout, stderr){
callback(null, stdout);
});
}