Anda dapat menggunakan handler Node.js untuk merespons event dan menjalankan logika bisnis. Topik ini menjelaskan konsep dan struktur handler Node.js serta menyediakan contoh.
Apa itu handler?
Handler untuk fungsi FC adalah metode dalam kode fungsi Anda yang memproses permintaan. Ketika fungsi FC Anda dipanggil, Function Compute menjalankan handler yang dikonfigurasi untuk memproses permintaan tersebut. Anda dapat mengonfigurasi handler di Function Compute console menggunakan parameter Handler.
Untuk fungsi FC berbasis Node.js, format handlernya adalah filename.methodName. Misalnya, jika file Anda bernama index.js atau index.mjs dan metodenya bernama handler, maka handlernya adalah index.handler.
Untuk informasi lebih lanjut tentang fungsi FC dan operasi terkait, lihat Buat fungsi yang dipicu oleh event.
Konfigurasi handler harus sesuai dengan spesifikasi konfigurasi Function Compute. Spesifikasi konfigurasi bervariasi tergantung pada jenis handler.
Tanda tangan handler
Function Compute mendukung modul ECMAScript (ES) mulai dari runtime Node.js 18. Sebelum itu (pada Node.js 16 dan versi sebelumnya), Function Compute hanya mendukung modul CommonJS. Untuk informasi lebih lanjut, lihat Tentukan handler sebagai modul ES.
Handler event sederhana memiliki tanda tangan berikut:
Node.js 18 atau Node.js 20
Modul ES
Kode contoh ini mendukung penerapan satu klik. Anda dapat menerapkan kode ini langsung di Function Compute (FC).start-fc3-nodejs-es
// index.mjs
export const handler = async (event, context) => {
console.log("receive event: \n" + event);
return "Hello World!";
};
Modul CommonJS
// index.js
exports.handler = async function(event, context) {
console.log("receive event: \n" + event);
return "Hello World!";
};
Node.js 16 dan sebelumnya
// index.js
exports.handler = async function(event, context, callback) {
console.log("event: \n" + event);
callback(null, 'hello world');
};
Kode contoh di atas dijelaskan sebagai berikut:
handler adalah nama metode, yang sesuai dengan Handler yang dikonfigurasi di Function Compute console. Misalnya, jika Anda menentukan index.handler sebagai Handler saat membuat fungsi, Function Compute akan memuat fungsi handler yang didefinisikan dalam file index.js dan memulai eksekusi.
Lingkungan runtime Function Compute meneruskan parameter permintaan ke handler permintaan. Parameter pertama adalah objek event, yang berisi muatan permintaan. Objek event bertipe Buffer, dan Anda dapat mengonversinya ke tipe objek yang Anda butuhkan. Parameter kedua adalah objek context, yang menyediakan informasi konteks runtime untuk pemanggilan tersebut. Untuk informasi lebih lanjut, lihat Context.
Saat menggunakan runtime Node.js 18 atau yang lebih baru, gunakan fitur Async/Await alih-alih
callback.Function Compute mengonversi hasil yang dikembalikan berdasarkan tipenya.
Tipe Buffer: Dikembalikan apa adanya.
Tipe Objek: Dikonversi ke format JSON dan dikembalikan.
Tipe lainnya: Dikonversi ke string dan dikembalikan.
Async/Await
Saat Anda menggunakan lingkungan runtime Node.js 18 atau yang lebih baru, kami menyarankan agar Anda menggunakan pendekatan Async/Await. Async/Await merupakan cara ringkas dan mudah dibaca untuk menulis kode asinkron di Node.js yang menghindari callback bersarang atau pemanggilan berantai.
Jika Anda menggunakan runtime Node.js 16 atau yang lebih lama, Anda harus secara eksplisit menggunakan metode callback untuk mengirim respons. Jika tidak, permintaan akan timeout.
Pendekatan Async/Await memiliki keunggulan berikut dibandingkan fungsi callback callback:
Peningkatan keterbacaan: Kode yang menggunakan
async/awaitlebih linear dan sinkron. Hal ini membuat kode lebih mudah dipahami dan dipelihara. Pendekatan ini menghindari callback yang bersarang dalam, sehingga menghasilkan struktur kode yang lebih jelas.Debugging dan penanganan error yang lebih sederhana: Anda dapat menggunakan blok
try-catchuntuk lebih mudah menangkap dan menangani error dalam operasi asinkron. Stack error lebih jelas, sehingga memudahkan Anda melacak sumber error secara akurat.Efisiensi lebih tinggi: Callback sering kali memerlukan perpindahan antar bagian kode yang berbeda. Pendekatan
async/awaitmengurangi jumlah pergantian konteks, sehingga meningkatkan efisiensi kode.
Contoh 1: Mengurai parameter berformat JSON
Kode contoh
Function Compute meneruskan parameter berformat JSON langsung ke fungsi Anda. Anda harus mengurai parameter tersebut dalam kode Anda. Kode berikut menunjukkan cara mengurai event berformat JSON.
Modul ES
Contoh ini hanya didukung pada runtime Node.js 18 dan yang lebih baru.
export const handler = async (event, context) => {
var eventObj = JSON.parse(event.toString());
return eventObj['key'];
};
Modul CommonJS
Kode contoh ini mendukung penerapan satu klik. Anda dapat menerapkan kode ini ke Function Compute (FC) dengan satu klik.start-fc3-nodejs-json
exports.handler = function(event, context, callback) {
var eventObj = JSON.parse(event.toString());
callback(null, eventObj['key']);
};
Prasyarat
Buat fungsi Node.js. Untuk informasi lebih lanjut, lihat Buat fungsi yang dipicu oleh event. Jika Anda ingin menentukan kode Anda sebagai modul ES, pilih Node.js 18 atau Node.js 20 sebagai runtime saat membuat fungsi.
Prosedur
Masuk ke Function Compute console. Di panel navigasi sebelah kiri, pilih .
Di bilah navigasi atas, pilih wilayah. Di halaman Functions, klik fungsi yang dituju.
Di halaman konfigurasi fungsi, pilih tab Code. Di editor kode, masukkan kode contoh di atas lalu klik Deploy.
CatatanHandler untuk fungsi dalam kode contoh di atas adalah metode
handlerdalam fileindex.js. Jika handler fungsi Anda dikonfigurasi berbeda, perbarui file dan metode yang sesuai.Di tab Code, klik ikon
di sebelah kanan Test Function. Dari daftar drop-down, pilih Configure Test Parameters. Masukkan parameter uji contoh berikut lalu klik OK.{ "key": "value" }Klik Test Function.
Setelah fungsi berhasil dijalankan, periksa responsnya. Responsnya adalah
value.
Contoh 2: Membaca dan menulis sumber daya OSS secara aman menggunakan Pasangan Kunci Akses temporary
Kode contoh
Gunakan Pasangan Kunci Akses temporary yang disediakan oleh Function Compute untuk mengakses Object Storage Service (OSS). Kode berikut merupakan contohnya.
Modul ES
Contoh ini hanya berjalan pada runtime 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 {
const uploadResult = await ossClient.put('myObj', Buffer.from('hello, fc', "utf-8"));
console.log('upload success, ', uploadResult);
return "put object"
} catch (error) {
throw error
}
};
Deskripsi kode:
context.credentials: Mendapatkan Pasangan Kunci Akses temporary dari parameter context. Hal ini menghindari hardcoding informasi sensitif seperti kata sandi dalam kode.myObj: Nama objek OSS.Buffer.from('hello, fc', "utf-8"): Konten objek yang akan diunggah.return "put object": Jika unggahan berhasil,put objectdikembalikan.throw err: Jika unggahan gagal, exception dilemparkan.
Modul CommonJS
Kode contoh ini mendukung penerapan satu klik. Terapkan kode ini ke Function Compute (FC) dengan satu klik.start-fc3-nodejs-oss
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-${context.region}`,
bucket: process.env.BUCKET_NAME,
});
ossClient.put('myObj', Buffer.from('hello, fc', "utf-8")).then(function (res) {
callback(null, 'put object');
}).catch(function (err) {
callback(err);
});
};
Deskripsi kode:
context.credentials: Mendapatkan Pasangan Kunci Akses temporary dari parametercontext. Hal ini menghindari hardcoding informasi sensitif seperti kata sandi dalam kode.myObj: Nama objek OSS.Buffer.from('hello, fc', "utf-8"): Konten objek yang akan diunggah.callback(null, 'put object'): Jika unggahan berhasil,put objectdikembalikan.callback(err): Jika unggahan gagal,errdikembalikan.
Prasyarat
Konfigurasikan role untuk layanan yang memiliki izin untuk mengakses OSS. Untuk informasi lebih lanjut, lihat Berikan izin Function Compute untuk mengakses layanan cloud lainnya menggunakan role fungsi.
Buat fungsi yang menggunakan runtime Node.js. Untuk informasi lebih lanjut, lihat Buat fungsi yang dipicu oleh event. Jika Anda ingin menentukan kode sebagai modul ES, atur runtime ke Node.js 18 atau Node.js 20 saat membuat fungsi.
Prosedur
Masuk ke Function Compute console. Di panel navigasi sebelah kiri, pilih .
Di bilah navigasi atas, pilih wilayah. Di halaman Functions, klik fungsi yang dituju.
(Opsional) Di tab Function Details fungsi, klik tab Code. Di bagian WebIDE, pilih untuk membuka terminal. Lalu, jalankan perintah berikut untuk menginstal dependensi ali-oss.
npm install ali-oss --saveSetelah instalasi selesai, folder
node_modulesakan dibuat di direktori kode di sisi kiri WebIDE. Folder tersebut berisi direktoriali-ossdan library dependensi lainnya.Di tab Function Details fungsi, klik tab Code. Di editor kode, masukkan kode contoh yang disediakan di atas. Lalu, simpan kode dan klik Deploy.
CatatanDalam kode contoh, handler fungsi adalah metode
handlerdalam fileindex.jsatauindex.mjs. Jika fungsi Anda menggunakan handler yang berbeda, perbarui file dan metode yang sesuai.Dalam kode contoh, Anda harus mengatur
regiondanbucketsesuai kebutuhan Anda.
Klik Test Function.
Setelah fungsi dieksekusi, lihat hasil yang dikembalikan. Hasilnya adalah
put object.
Contoh 3: Memanggil perintah eksternal
Program Node.js juga dapat membuat proses fork untuk memanggil perintah eksternal. Misalnya, Anda dapat menggunakan modul child_process untuk memanggil perintah Linux ls -l dan mencantumkan file di direktori saat ini. Kode berikut memberikan contohnya.
Modul ES
Contoh ini hanya berjalan pada runtime Node.js 18 dan yang lebih baru.
'use strict';
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
Kode ini mendukung penerapan satu klik. Anda dapat menerapkan kode ini ke Function Compute (FC) dengan satu klik.start-fc3-nodejs-exec
'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);
});
}Contoh 4: Memanggil fungsi menggunakan pemicu HTTP
Kode contoh
Gunakan URL yang disediakan oleh pemicu HTTP untuk memanggil fungsi. Kode berikut merupakan contohnya.
Jika Authentication Method untuk pemicu HTTP diatur ke No Authentication, gunakan Postman atau perintah curl untuk memanggil fungsi. Untuk informasi lebih lanjut, lihat Prosedur.
Jika Authentication Method untuk pemicu HTTP diatur ke Signature Authentication, JWT authentication atau Bearer authentication, gunakan metode autentikasi yang sesuai untuk memanggil fungsi. Untuk informasi lebih lanjut, lihat Authentication.
Untuk informasi tentang format muatan permintaan dan respons untuk panggilan yang dilakukan oleh pemicu HTTP, lihat Panggil fungsi menggunakan pemicu HTTP.
Modul ES
Contoh ini hanya didukung pada runtime Node.js 18 atau yang lebih baru.
'use strict';
export const handler = async (event, context) => {
const eventObj = JSON.parse(event);
console.log(`receive event: ${JSON.stringify(eventObj)}`);
let body = 'Hello World!';
// get http request body
if ("body" in eventObj) {
body = eventObj.body;
if (eventObj.isBase64Encoded) {
body = Buffer.from(body, 'base64').toString('utf-8');
}
}
console.log(`receive http body: ${body}`);
return {
'statusCode': 200,
'body': body
};
}
Modul CommonJS
Kode contoh ini mendukung penerapan satu klik. Anda dapat menerapkan kode ini ke Function Compute (FC) dengan satu klik.start-fc3-nodejs-http
'use strict';
exports.handler = (event, context, callback) => {
const eventObj = JSON.parse(event);
console.log(`receive event: ${JSON.stringify(eventObj)}`);
let body = 'Hello World!';
// get http request body
if ("body" in eventObj) {
body = eventObj.body;
if (eventObj.isBase64Encoded) {
body = Buffer.from(body, 'base64').toString('utf-8');
}
}
console.log(`receive http body: ${body}`);
callback(null, {
'statusCode': 200,
'body': body
});
}
Prasyarat
Fungsi yang menggunakan runtime Node.js dan pemicu HTTP telah dibuat berdasarkan contoh sebelumnya. Untuk informasi lebih lanjut, lihat Buat fungsi yang dipicu oleh event dan Konfigurasikan pemicu HTTP. Jika Anda ingin menentukan kode sebagai modul ES, pilih Node.js 18 atau Node.js 20 untuk runtime saat membuat fungsi.
Prosedur
Masuk ke Function Compute console. Di panel navigasi sebelah kiri, pilih .
Di bilah navigasi atas, pilih wilayah. Di halaman Functions, klik fungsi yang dituju.
Di halaman detail fungsi, klik tab Triggers. Di halaman Triggers, dapatkan titik akhir publik dari pemicu HTTP.
Jalankan perintah berikut di tool curl untuk memanggil fungsi.
curl -i "https://test-nodejs-dlgxxr****.cn-shanghai.fcapp.run" -d 'Hello World!'Dalam perintah di atas,
https://test-nodejs-dlgxxr****.cn-shanghai.fcapp.runadalah titik akhir publik dari pemicu HTTP.Respons berikut dikembalikan.
HTTP/1.1 200 OK Access-Control-Expose-Headers: Date,x-fc-request-id Content-Disposition: attachment Content-Length: 12 Content-Type: text/html; charset=utf-8 Etag: W/"c-Lve95gjOVATpfV8EL5X4nxwjKHE" X-Fc-Request-Id: 1-65d866a8-15d8796a-cb9b4feb69ca X-Powered-By: Express Date: Fri, 23 Feb 2024 09:34:34 GMT Hello World!
Contoh 5: Gunakan pemicu HTTP untuk mengunduh file
Kode contoh
Untuk mengembalikan gambar, paket terkompresi, atau file biner dari kode Anda, gunakan pemicu HTTP. Kode berikut memberikan contohnya.
Modul ES
Contoh ini hanya didukung pada runtime Node.js 18 atau yang lebih baru.
// index.mjs
'use strict';
import mime from 'mime';
import fs from 'fs/promises';
import path from 'path';
export const handler = async (event, context) => {
const fileContent = 'This is a sample text file created in the code.';
const fileName = 'sample.txt';
const filePath = path.join('/tmp', fileName);
try {
await fs.writeFile(filePath, fileContent);
const mimeType = mime.getType(filePath);
if (!mimeType) {
throw new Error('Unable to determine MIME type');
}
const fileData = await fs.readFile(filePath);
const fileBase64 = Buffer.from(fileData).toString('base64');
const fcResponse = {
'statusCode': 200,
'headers': {
'Content-Type': mimeType,
'Content-Disposition': `attachment; filename="${fileName}"`,
},
'body': fileBase64,
'isBase64Encoded': true
};
console.log('File generated and fetched successfully.');
return fcResponse;
} catch (err) {
console.error(err);
return {
'statusCode': 500,
'body': err.message
};
}
};Modul CommonJS
// index.js
'use strict';
const mime = require('mime');
const fs = require('fs');
const path = require('path');
exports.handler = async (event, context, callback) => {
const fileContent = 'This is a sample text file created in the code.';
const fileName = 'sample.txt';
const filePath = path.join('/tmp', fileName);
try {
fs.writeFileSync(filePath, fileContent);
const mimeType = mime.getType(filePath);
if (!mimeType) {
throw new Error('Unable to determine MIME type');
}
const fileData = fs.readFileSync(filePath);
const fileBase64 = Buffer.from(fileData).toString('base64');
const fcResponse = {
'statusCode': 200,
'headers': {
'Content-Type': mimeType,
'Content-Disposition': `attachment; filename="${fileName}"`,
},
'body': fileBase64,
'isBase64Encoded': true
};
console.log('File generated and fetched successfully.');
callback(null, fcResponse);
} catch (err) {
console.error(err);
callback(null, {
'statusCode': 500,
'body': err.message
});
}
};
Prasyarat
Buat fungsi yang menggunakan runtime Node.js dan pemicu HTTP berdasarkan contoh sebelumnya. Untuk informasi lebih lanjut, lihat Buat fungsi yang dipicu oleh event dan Konfigurasikan pemicu HTTP. Jika Anda ingin menentukan kode sebagai modul ES, atur runtime ke Node.js 18 atau Node.js 20 saat membuat fungsi.
Prosedur
Masuk ke Function Compute console. Di panel navigasi sebelah kiri, pilih .
Di bilah navigasi atas, pilih wilayah. Di halaman Functions, klik fungsi yang dituju.
Di halaman detail fungsi, klik tab Code, lalu pilih untuk membuka jendela terminal. Jalankan perintah
npm install mime@2untuk menginstal library mime. Setelah instalasi selesai, klik Deploy.Di tab Trigger fungsi, dapatkan Internet Endpoint dari pemicu HTTP. Salin URL tersebut ke browser Anda dan tekan Enter.
Setelah Anda menekan Enter, fungsi akan dipicu. Jika fungsi berhasil dijalankan, file akan diunduh ke mesin lokal Anda.