Function Compute menangkap error yang dilemparkan oleh fungsi Node.js Anda dan mengembalikan respons terstruktur. Halaman ini mencakup dua kategori error yang dapat dihasilkan oleh fungsi Node.js serta cara menafsirkan kode status HTTP dari layanan tersebut.
Jenis error
Pengecualian yang ditangkap
Ketika fungsi Anda melemparkan pengecualian, Function Compute menangkapnya dan mengembalikan objek JSON dengan tiga bidang:
| Bidang | Deskripsi |
|---|---|
errorMessage |
String pesan error |
errorType |
Nama kelas error JavaScript |
stackTrace |
Array berisi frame stack |
Modul ECMAScript
Sintaksis modul ECMAScript memerlukan Node.js 18 atau versi lebih baru. Kode contoh mendukung penerapan satu klik (nodejs-fc-err-es).export const handler = async (event, context) => {
throw new Error('oops');
};
Modul CommonJS
exports.handler = function(event, context, callback) {
throw new Error('oops');
};
Contoh respons:
{
"errorMessage": "oops",
"errorType": "Error",
"stackTrace": [
"Error: oops",
" at handler (file:///code/index.mjs:2:9)",
" at module.exports (file:///var/fc/runtime/nodejs20/bootstrap.mjs:5655:14)",
" at process.processTicksAndRejections (node:internal/process/task_queues:95:5)"
]
}
Keluar tidak normal
Jika fungsi Anda memanggil process.exit() saat berjalan, runtime tidak dapat menangkap error terstruktur. Layanan tersebut malah mengembalikan pesan umum:
Modul ECMAScript
Sintaksis modul ECMAScript memerlukan Node.js 18 atau versi lebih baru.
export const handler = async (event, context) => {
process.exit(1);
};
Modul CommonJS
exports.handler = function(event, context, callback) {
process.exit(1);
};
Contoh respons:
{
"errorMessage": "Process exited unexpectedly before completing request (duration: 12ms, maxMemoryUsage: 0MB)"
}
Kode status HTTP
Respons 2xx tidak menjamin keberhasilan fungsi. Periksa header respons X-Fc-Error-Type untuk mendeteksi error fungsi yang dikembalikan dengan kode status 2xx.
Ketika pemanggilan fungsi gagal, Function Compute mengembalikan kode status HTTP, badan respons, dan — untuk error tingkat fungsi — header respons X-Fc-Error-Type. Periksa sinyal-sinyal ini untuk menangani error dalam kode atau menampilkannya kepada pengguna akhir.
| Kode status | Makna |
|---|---|
| 2xx | Function Compute menerima permintaan. Jika respons menyertakan header X-Fc-Error-Type, berarti terjadi error fungsi — misalnya, pengecualian yang tidak ditangkap dalam kode Anda. |
| 4xx (kecuali 429) | Klien yang memulai pemanggilan mengirim permintaan tidak valid. |
| 429 | Permintaan dibatasi lajunya (throttled). |
| 5xx | Terjadi error internal di Function Compute, konfigurasi fungsi tidak valid, atau terdapat masalah sumber daya. |
Untuk informasi lebih lanjut tentang error pemanggilan, lihat Konfigurasikan mekanisme retry.
FAQ
require tidak didefinisikan dalam cakupan modul ES
Gejala
Ketika file entri fungsi Node.js dimuat sebagai modul ES (ekstensi file adalah .mjs, atau package.json menetapkan "type": "module") dan kode menggunakan require() untuk memuat modul, pemanggilan mengembalikan kode status HTTP 200, header respons menyertakan X-Fc-Error-Type: InvocationError, dan badan respons berisi error berikut:
{
"errorMessage": "require is not defined in ES module scope, you can use import instead",
"errorType": "ReferenceError",
"stackTrace": [
"ReferenceError: require is not defined in ES module scope, you can use import instead",
" at file:///code/index.mjs:1:15",
" at ModuleJob.run (node:internal/modules/esm/module_job:218:25)"
]
}
Konten error bervariasi tergantung pada jenis file entri dan lokasi pemanggilan require():
-
Jika file entri memiliki ekstensi
.jsdanpackage.jsonmenetapkan"type": "module",errorMessagemenyertakan baris tambahan:This file is being treated as an ES module because it has a '.js' file extension and '/code/package.json' contains "type": "module". To treat it as a CommonJS script, rename it to use the '.cjs' file extension. -
Jika
require()dipanggil di dalam fungsi handler dan bukan di tingkat atas modul,errorMessageberisirequire is not defined.
Penyebab
require() adalah fungsi pemuatan sistem modul CommonJS dan tidak tersedia dalam cakupan modul ES. Setelah sebuah file diidentifikasi sebagai modul ES, Node.js tidak menyisipkan variabel CommonJS seperti require, module, dan exports.
Solusi
Pilih salah satu metode berikut berdasarkan struktur kode Anda:
-
Tulis ulang
require()menjadi pernyataanimportmodul ES. Untuk memuat modul secara dinamis, gunakan ekspresiimport(). -
Untuk mempertahankan sintaksis
require(), ubah ekstensi file entri menjadi.cjs. Tidak diperlukan perubahan pada konfigurasi handler fungsi.
Contoh berikut menunjukkan penulisan ulang dengan modul ES (file entri index.mjs):
// Impor modul bawaan Node.js dan file modul ES lokal
import { createHash } from 'node:crypto';
import { helper } from './utils.mjs';
export const handler = async (event, context) => {
return createHash('sha256').update(helper()).digest('hex');
};
Contoh berikut menunjukkan cara memuat modul secara dinamis:
const crypto = await import('node:crypto');
Contoh berikut menunjukkan sintaksis CommonJS (file entri index.cjs):
const crypto = require('crypto');
exports.handler = async (event, context) => {
return crypto.createHash('sha256').digest('hex');
};
Catatan: Untuk memuat dependensi pihak ketiga (sepertilodash), jalankannpm installsecara lokal terlebih dahulu, lalu kemas dan terapkan direktorinode_modulesbersama kode Anda. Dalam modul ES, Anda dapat mereferensikan dependensi CommonJS dengan menggunakan impor default, misalnya,import _ from 'lodash';.
Modul ES hanya didukung pada runtime Node.js 18 dan versi lebih baru. Pada runtime Node.js 16 dan versi sebelumnya, file entri .mjs tidak dimuat, dan pemanggilan mengembalikan "errorMessage": "Module '/code/index.js' is missing." dan "errorType": "FunctionUnhandledError: ImportModuleError".