Pilih preferensi cookie Anda

Kami menggunakan cookie penting serta alat serupa yang diperlukan untuk menyediakan situs dan layanan. Kami menggunakan cookie performa untuk mengumpulkan statistik anonim sehingga kami dapat memahami cara pelanggan menggunakan situs dan melakukan perbaikan. Cookie penting tidak dapat dinonaktifkan, tetapi Anda dapat mengklik “Kustom” atau “Tolak” untuk menolak cookie performa.

Jika Anda setuju, AWS dan pihak ketiga yang disetujui juga akan menggunakan cookie untuk menyediakan fitur situs yang berguna, mengingat preferensi Anda, dan menampilkan konten yang relevan, termasuk iklan yang relevan. Untuk menerima atau menolak semua cookie yang tidak penting, klik “Terima” atau “Tolak”. Untuk membuat pilihan yang lebih detail, klik “Kustomisasi”.

Tentukan penangan fungsi Lambda di Node.js

Mode fokus
Tentukan penangan fungsi Lambda di Node.js - AWS Lambda

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Handler fungsi Lambda Anda adalah metode dalam kode fungsi Anda yang memproses peristiwa. Saat fungsi Anda diaktifkan, Lambda menjalankan metode handler. Fungsi Anda berjalan sampai handler mengembalikan respons, keluar, atau waktu habis.

Dasar-dasar penangan Node.js

Contoh fungsi berikut mencatat isi dari objek acara dan mengembalikan lokasi log.

catatan

Halaman ini menunjukkan contoh penangan modul CommonJS dan ES. Untuk mempelajari tentang perbedaan antara kedua jenis handler ini, lihatMenunjuk penangan fungsi sebagai modul ES.

ES module handler
export const handler = async (event, context) => { console.log("EVENT: \n" + JSON.stringify(event, null, 2)); return context.logStreamName; };
CommonJS module handler
exports.handler = async function (event, context) { console.log("EVENT: \n" + JSON.stringify(event, null, 2)); return context.logStreamName; };
export const handler = async (event, context) => { console.log("EVENT: \n" + JSON.stringify(event, null, 2)); return context.logStreamName; };

Saat Anda mengonfigurasi fungsi, nilai pengaturan handler adalah nama file dan nama metode handler yang diekspor, dipisahkan oleh titik. Default di konsol dan untuk contoh dalam panduan ini adalahindex.handler. Hal ini menunjukkan metode handler yang diekspor dari file index.js.

Runtime meneruskan argumen ke metode handler. Argumen pertama adalah objek event, yang berisi informasi dari invoker. Invoker menyampaikan informasi ini sebagai string yang diformat JSON saat memanggil Invoke, dan runtime mengonversinya ke objek. Ketika AWS layanan memanggil fungsi Anda, struktur acara bervariasi menurut layanan.

Argumen kedua adalah objek konteks, yang berisi informasi tentang lingkungan invokasi, fungsi, dan eksekusi. Pada contoh sebelumnya, fungsi mendapatkan nama alur log dari objek konteks dan mengembalikannya ke invoker.

Anda juga dapat menggunakan argumen callback, yang merupakan fungsi yang dapat Anda panggil di penangan non-async untuk mengirim respons. Kami menyarankan Anda menggunakan async/await instead of callbacks. Async/await provides improved readability, error handling, and efficiency. For more information about the differences between async/await dan menelepon balik, lihatMenggunakan callback.

Penamaan

Saat Anda mengonfigurasi fungsi, nilai pengaturan handler adalah nama file dan nama metode handler yang diekspor, dipisahkan oleh titik. Default untuk fungsi yang dibuat di konsol dan untuk contoh dalam panduan ini adalahindex.handler. Ini menunjukkan handler metode yang diekspor dari index.mjs file index.js atau.

Jika Anda membuat fungsi di konsol menggunakan nama file atau nama pengendali fungsi yang berbeda, Anda harus mengedit nama handler default.

Untuk mengubah nama fungsi handler (konsol)
  1. Buka halaman Fungsi di konsol Lambda dan pilih fungsi Anda.

  2. Pilih tab Kode.

  3. Gulir ke bawah ke panel pengaturan Runtime dan pilih Edit.

  4. Di Handler, masukkan nama baru untuk handler fungsi Anda.

  5. Pilih Simpan.

Menggunakan async/await

Jika kode Anda melakukan tugas asinkron, gunakanasync/await pattern to make sure that the handler finishes running. Async/await is a concise and readable way to write asynchronous code in Node.js, without the need for nested callbacks or chaining promises. With async/await, Anda dapat menulis kode yang berbunyi seperti kode sinkron, sambil tetap asinkron dan tidak memblokir.

asyncKata kunci menandai fungsi sebagai asinkron, dan await kata kunci menjeda eksekusi fungsi sampai a diselesaikan. Promise

catatan

Pastikan untuk menunggu acara asinkron selesai. Jika fungsi kembali sebelum peristiwa async selesai, fungsi mungkin gagal atau menyebabkan perilaku tak terduga dalam aplikasi Anda. Ini bisa terjadi ketika forEach loop berisi peristiwa async. forEachloop mengharapkan panggilan sinkron. Untuk informasi selengkapnya, lihat Array.prototype.forEach () di dokumentasi Mozilla.

ES module handler
contoh — Permintaan HTTP dengan async/await
const url = "https://aws.amazon.com/"; export const handler = async(event) => { try { // fetch is available in Node.js 18 and later runtimes const res = await fetch(url); console.info("status", res.status); return res.status; } catch (e) { console.error(e); return 500; } };
CommonJS module handler
contoh — Permintaan HTTP dengan async/await
const https = require("https"); let url = "https://aws.amazon.com/"; exports.handler = async function (event) { let statusCode; await new Promise(function (resolve, reject) { https.get(url, (res) => { statusCode = res.statusCode; resolve(statusCode); }).on("error", (e) => { reject(Error(e)); }); }); console.log(statusCode); return statusCode; };
contoh — Permintaan HTTP dengan async/await
const url = "https://aws.amazon.com/"; export const handler = async(event) => { try { // fetch is available in Node.js 18 and later runtimes const res = await fetch(url); console.info("status", res.status); return res.status; } catch (e) { console.error(e); return 500; } };

Contoh berikutnya menggunakan async/await untuk mencantumkan bucket Amazon Simple Storage Service Anda.

catatan

Sebelum menggunakan contoh ini, pastikan peran eksekusi fungsi Anda memiliki izin baca Amazon S3.

ES module handler
contoh — AWS SDK v3 dengan async/await

Contoh ini menggunakan AWS SDK for JavaScript v3, yang tersedia di nodejs18.x dan kemudian runtime.

import {S3Client, ListBucketsCommand} from '@aws-sdk/client-s3'; const s3 = new S3Client({region: 'us-east-1'}); export const handler = async(event) => { const data = await s3.send(new ListBucketsCommand({})); return data.Buckets; };
CommonJS module handler
contoh — AWS SDK v3 dengan async/await

Contoh ini menggunakan AWS SDK for JavaScript v3, yang tersedia di nodejs18.x dan kemudian runtime.

const { S3Client, ListBucketsCommand } = require('@aws-sdk/client-s3'); const s3 = new S3Client({ region: 'us-east-1' }); exports.handler = async (event) => { const data = await s3.send(new ListBucketsCommand({})); return data.Buckets; };
contoh — AWS SDK v3 dengan async/await

Contoh ini menggunakan AWS SDK for JavaScript v3, yang tersedia di nodejs18.x dan kemudian runtime.

import {S3Client, ListBucketsCommand} from '@aws-sdk/client-s3'; const s3 = new S3Client({region: 'us-east-1'}); export const handler = async(event) => { const data = await s3.send(new ListBucketsCommand({})); return data.Buckets; };

Menggunakan callback

Kami menyarankan Anda menggunakan async/await untuk mendeklarasikan fungsi handler alih-alih menggunakan callback. Async/await adalah pilihan yang lebih baik karena beberapa alasan:

  • Keterbacaan: Kode async/await lebih mudah dibaca dan dipahami daripada kode panggilan balik, yang dapat dengan cepat menjadi sulit untuk diikuti dan menghasilkan neraka panggilan balik.

  • Debugging dan penanganan kesalahan: Debugging kode berbasis callback bisa jadi sulit. Tumpukan panggilan bisa menjadi sulit untuk diikuti dan kesalahan dapat dengan mudah ditelan. Dengan async/await, you can use try/catch blok untuk menangani kesalahan.

  • Efisiensi: Callback sering memerlukan peralihan di antara bagian-bagian kode yang berbeda. Async/await dapat mengurangi jumlah sakelar konteks, menghasilkan kode yang lebih efisien.

Saat Anda menggunakan callback di handler Anda, fungsi terus dijalankan hingga loop peristiwa kosong atau fungsi habis waktu. Respons tidak dikirimkan ke invoker hingga semua tugas loop peristiwa selesai. Jika waktu fungsi habis, kesalahan akan dikembalikan. Anda dapat mengonfigurasi runtime untuk mengirim respons segera dengan menyetel konteks. callbackWaitsForEmptyEventLooppalsu.

Fungsi panggilan balik memiliki dua argumen: Error dan respons. Objek respons harus kompatibel dengan JSON.stringify.

Fungsi contoh berikut memeriksa URL dan mengembalikan kode status kepada invoker.

ES module handler
contoh — Permintaan HTTP dengan callback
import https from "https"; let url = "https://aws.amazon.com/"; export function handler(event, context, callback) { https.get(url, (res) => { callback(null, res.statusCode); }).on("error", (e) => { callback(Error(e)); }); }
CommonJS module handler
contoh — Permintaan HTTP dengan callback
const https = require("https"); let url = "https://aws.amazon.com/"; exports.handler = function (event, context, callback) { https.get(url, (res) => { callback(null, res.statusCode); }).on("error", (e) => { callback(Error(e)); }); };
contoh — Permintaan HTTP dengan callback
import https from "https"; let url = "https://aws.amazon.com/"; export function handler(event, context, callback) { https.get(url, (res) => { callback(null, res.statusCode); }).on("error", (e) => { callback(Error(e)); }); }

Dalam contoh berikutnya, respons dari Amazon S3 dikembalikan ke pemanggil segera setelah tersedia. Waktu habis pada loop peristiwa dibekukan, dan terus berjalan pada saat fungsi diaktifkan berikutnya.

catatan

Sebelum menggunakan contoh ini, pastikan peran eksekusi fungsi Anda memiliki izin baca Amazon S3.

ES module handler
contoh - AWS SDK v3 dengan callbackWaitsFor EmptyEventLoop

Contoh ini menggunakan AWS SDK for JavaScript v3, yang tersedia di nodejs18.x dan kemudian runtime.

import AWS from "@aws-sdk/client-s3"; const s3 = new AWS.S3({}); export const handler = function (event, context, callback) { context.callbackWaitsForEmptyEventLoop = false; s3.listBuckets({}, callback); setTimeout(function () { console.log("Timeout complete."); }, 5000); };
CommonJS module handler
contoh - AWS SDK v3 dengan callbackWaitsFor EmptyEventLoop

Contoh ini menggunakan AWS SDK for JavaScript v3, yang tersedia di nodejs18.x dan kemudian runtime.

const AWS = require("@aws-sdk/client-s3"); const s3 = new AWS.S3({}); exports.handler = function (event, context, callback) { context.callbackWaitsForEmptyEventLoop = false; s3.listBuckets({}, callback); setTimeout(function () { console.log("Timeout complete."); }, 5000); };
contoh - AWS SDK v3 dengan callbackWaitsFor EmptyEventLoop

Contoh ini menggunakan AWS SDK for JavaScript v3, yang tersedia di nodejs18.x dan kemudian runtime.

import AWS from "@aws-sdk/client-s3"; const s3 = new AWS.S3({}); export const handler = function (event, context, callback) { context.callbackWaitsForEmptyEventLoop = false; s3.listBuckets({}, callback); setTimeout(function () { console.log("Timeout complete."); }, 5000); };

Praktik terbaik kode untuk fungsi Lambda Node.js

Patuhi pedoman dalam daftar berikut untuk menggunakan praktik pengkodean terbaik saat membangun fungsi Lambda Anda:

  • Pisahkan handler Lambda dari logika inti Anda. Ini memungkinkan Anda untuk membuat fungsi yang lebih dapat teruji. Dalam Node.js, ini mungkin terlihat seperti:

    exports.myHandler = function(event, context, callback) { var foo = event.foo; var bar = event.bar; var result = MyLambdaFunction (foo, bar); callback(null, result); } function MyLambdaFunction (foo, bar) { // MyLambdaFunction logic here }
  • Kontrol dependensi dalam paket penerapan fungsi Anda. Lingkungan AWS Lambda eksekusi berisi sejumlah pustaka. Untuk runtime Node.js dan Python, ini termasuk file. AWS SDKs Untuk mengaktifkan serangkaian fitur dan pembaruan keamanan terbaru, Lambda akan memperbarui pustaka ini secara berkala. Pembaruan ini dapat memberikan perubahan kecil pada perilaku fungsi Lambda Anda. Untuk memiliki kendali penuh atas dependensi yang digunakan fungsi Anda, kemas semua dependensi Anda dengan paket deployment Anda.

  • Minimalkan kompleksitas dependensi Anda. Utamakan memilih kerangka kerja lebih sederhana yang cepat dimuat dalam memulai lingkungan eksekusi.

  • Minimalkan ukuran paket penerapan Anda sesuai kebutuhan runtime-nya. Ini akan mengurangi jumlah waktu yang dibutuhkan untuk mengunduh dan membongkar paket deployment Anda sebelum invokasi.

  • Manfaatkan penggunaan kembali lingkungan eksekusi untuk meningkatkan kinerja fungsi Anda. Inisialisasi klien SDK dan koneksi basis data di luar fungsi handler, dan lakukan caching aset statis secara lokal di direktori /tmp. Invokasi selanjutnya yang diproses oleh instans yang sama dari fungsi Anda dapat menggunakan kembali sumber daya ini. Ini menghemat biaya dengan mengurangi waktu pengoperasian fungsi.

    Untuk menghindari potensi kebocoran data di seluruh invokasi, jangan menggunakan lingkungan eksekusi untuk menyimpan data pengguna, peristiwa, atau informasi lainnya implikasi keamanan. Jika fungsi Anda bergantung pada status yang dapat disenyapkan yang tidak dapat disimpan dalam memori di dalam handler, pertimbangkan untuk membuat fungsi terpisah atau versi terpisah dari fungsi untuk setiap pengguna.

  • Gunakan arahan keep-alive untuk mempertahankan koneksi yang persisten. Lambda membersihkan koneksi idle dari waktu ke waktu. Mencoba menggunakan ulang koneksi idle saat mengidentifikasi suatu fungsi akan menyebabkan kesalahan koneksi. Untuk mempertahankan koneksi yang persisten, gunakan arahan tetap aktif yang berkaitan dengan runtime Anda. Sebagai contoh, lihat Menggunakan Kembali Koneksi dengan Keep-Alive di Node.js.

  • Gunakan variabel lingkungan untuk meneruskan parameter operasional ke fungsi Anda. Misalnya, jika Anda ingin menulis ke bucket Amazon S3 alih-alih melakukan hard-coding nama bucket yang Anda tulis, konfigurasikan nama bucket sebagai variabel lingkungan.

  • Hindari menggunakan pemanggilan rekursif dalam fungsi Lambda Anda, di mana fungsi memanggil dirinya sendiri atau memulai proses yang dapat memanggil fungsi lagi. Hal ini dapat menyebabkan volume invokasi fungsi yang tidak diinginkan dan peningkatan biaya. Jika Anda melihat volume pemanggilan yang tidak diinginkan, setel konkurensi fungsi cadangan untuk 0 segera membatasi semua pemanggilan ke fungsi, saat Anda memperbarui kode.

  • Jangan gunakan non-dokumen, non-publik APIs dalam kode fungsi Lambda Anda. Untuk runtime AWS Lambda terkelola, Lambda secara berkala menerapkan pembaruan keamanan dan fungsional ke internal Lambda. APIs Pembaruan API internal ini mungkin tidak kompatibel ke belakang, yang menyebabkan konsekuensi yang tidak diinginkan seperti kegagalan pemanggilan jika fungsi Anda memiliki ketergantungan pada non-publik ini. APIs Lihat referensi API untuk daftar yang tersedia APIs untuk umum.

  • Tulis kode idempoten. Menulis kode idempoten untuk fungsi Anda memastikan bahwa peristiwa duplikat ditangani dengan cara yang sama. Kode Anda harus memvalidasi peristiwa dengan benar dan menangani peristiwa duplikat dengan anggun. Untuk informasi selengkapnya, lihat Bagaimana cara membuat fungsi Lambda saya idempoten? .

PrivasiSyarat situsPreferensi cookie
© 2025, Amazon Web Services, Inc. atau afiliasinya. Semua hak dilindungi undang-undang.