API GraphQL Blue mengembalikan kesalahan dalam format standar yang mengikuti spesifikasi GraphQL. Ketika kesalahan terjadi, respon mencakup array errors dengan informasi rinci tentang apa yang salah.
Contoh Respon Kesalahan
{
"errors": [
{
"message": "Todo was not found.",
"extensions": {
"code": "TODO_NOT_FOUND"
}
}
]
}
Struktur Kesalahan
Setiap objek kesalahan berisi:
- message: Deskripsi kesalahan yang dapat dibaca manusia
- extensions.code: Kode kesalahan yang dapat dibaca mesin untuk penanganan programatik
Keamanan Kesalahan Produksi
Blue menerapkan sistem keamanan untuk paparan kesalahan:
- Kesalahan Aman: Menampilkan kode kesalahan dan pesan yang sebenarnya kepada klien
- Kesalahan Tidak Aman: Mengembalikan
INTERNAL_SERVER_ERROR generik untuk menyembunyikan detail sensitif
- Sumber Daya Tidak Ditemukan: Semua kesalahan
*_NOT_FOUND dianggap aman dan selalu dipaparkan
Kategori Kesalahan
Blue mendefinisikan 108 kode kesalahan kustom yang diorganisir ke dalam kategori berikut:
Kesalahan Autentikasi & Otorisasi
| Kode Kesalahan |
Pesan |
Deskripsi |
UNAUTHENTICATED |
"Autentikasi diperlukan." |
Permintaan memerlukan autentikasi tetapi tidak ada yang diberikan |
FORBIDDEN |
"Anda tidak diizinkan." |
Terautentikasi tetapi tidak memiliki izin yang diperlukan |
Kesalahan Sumber Daya Tidak Ditemukan (52 total)
Sumber Daya Inti
| Kode Kesalahan |
Pesan |
Deskripsi |
TODO_NOT_FOUND |
"Todo tidak ditemukan." |
Rekaman/todo tidak ada atau pengguna tidak memiliki akses |
TODO_LIST_NOT_FOUND |
"Daftar todo tidak ditemukan." |
Daftar tidak ada atau pengguna tidak memiliki akses |
PROJECT_NOT_FOUND |
"Proyek tidak ditemukan." |
Proyek tidak ada atau pengguna tidak memiliki akses |
COMPANY_NOT_FOUND |
"Perusahaan tidak ditemukan." |
Perusahaan tidak ada atau pengguna tidak memiliki akses |
USER_NOT_FOUND |
"Pengguna tidak ditemukan." |
Pengguna tidak ada dalam sistem |
| Kode Kesalahan |
Pesan |
Deskripsi |
CUSTOM_FIELD_NOT_FOUND |
"Bidang kustom tidak ditemukan." |
Bidang kustom tidak ada |
CUSTOM_FIELD_OPTION_NOT_FOUND |
"Opsi bidang kustom tidak ditemukan." |
Opsi bidang pilih tidak ada |
FORM_NOT_FOUND |
"Formulir tidak ditemukan." |
Template formulir tidak ada |
FORM_FIELD_NOT_FOUND |
"Bidang formulir tidak ditemukan." |
Bidang formulir tidak ada |
Komponen Proyek
| Kode Kesalahan |
Pesan |
Deskripsi |
TAG_NOT_FOUND |
"Tag tidak ditemukan." |
Tag tidak ada dalam proyek |
AUTOMATION_NOT_FOUND |
"Automasi tidak ditemukan." |
Aturan automasi tidak ada |
CHART_NOT_FOUND |
"Grafik tidak ditemukan." |
Grafik dasbor tidak ada |
WEBHOOK_NOT_FOUND |
"Webhook tidak ditemukan." |
Konfigurasi webhook tidak ada |
TEMPLATE_NOT_FOUND |
"Template tidak ditemukan." |
Template proyek tidak ada |
Komentar & Aktivitas
| Kode Kesalahan |
Pesan |
Deskripsi |
COMMENT_NOT_FOUND |
"Komentar tidak ditemukan." |
Komentar tidak ada |
ACTIVITY_NOT_FOUND |
"Aktivitas tidak ditemukan." |
Entri log aktivitas tidak ada |
REACTION_NOT_FOUND |
"Reaksi tidak ditemukan." |
Reaksi komentar tidak ada |
Sumber Daya Lainnya
| Kode Kesalahan |
Pesan |
Deskripsi |
FILE_NOT_FOUND |
"File tidak ditemukan." |
Lampiran file tidak ada |
SUBSCRIPTION_NOT_FOUND |
"Langganan tidak ditemukan." |
Langganan penagihan tidak ada |
INVOICE_NOT_FOUND |
"Faktur tidak ditemukan." |
Rekaman faktur tidak ada |
CHECKLIST_NOT_FOUND |
"Checklist tidak ditemukan." |
Checklist tidak ada |
CHECKLIST_ITEM_NOT_FOUND |
"Item checklist tidak ditemukan." |
Item checklist tidak ada |
PROJECT_ROLE_NOT_FOUND |
"Peran proyek tidak ditemukan." |
Peran proyek kustom tidak ada |
PROJECT_ACCESS_NOT_FOUND |
"Akses proyek tidak ditemukan." |
Akses proyek pengguna tidak ada |
NOTIFICATION_NOT_FOUND |
"Notifikasi tidak ditemukan." |
Notifikasi tidak ada |
DASHBOARD_NOT_FOUND |
"Dasbor tidak ditemukan." |
Dasbor tidak ada |
KEY_NOT_FOUND |
"Kunci tidak ditemukan." |
Kunci pengaturan tidak ada |
Kesalahan Validasi
| Kode Kesalahan |
Pesan |
Deskripsi |
BAD_USER_INPUT |
"Input tidak valid." |
Kegagalan validasi input generik |
VALIDATION_ERROR |
"Parameter tidak valid" |
Parameter permintaan gagal validasi |
BAD_EMAIL |
"Anda perlu memasukkan email yang valid." |
Format email tidak valid |
INVALID_IDS |
"ID tidak valid." |
Satu atau lebih ID dalam permintaan tidak valid |
PHONE_INVALID |
"Telepon tidak valid." |
Format nomor telepon tidak valid |
URL_INVALID |
"URL tidak valid." |
Format URL tidak valid |
INVALID_RECURRING_DUE_DATE |
"Tanggal jatuh tempo tidak valid untuk tugas berulang" |
Validasi tanggal tugas berulang gagal |
INVALID_COLOR |
"Warna tidak valid" |
Nilai warna tidak sesuai dengan format yang diharapkan |
Kesalahan Logika Bisnis
Batas & Kuota
| Kode Kesalahan |
Pesan |
Deskripsi |
COMPANY_LIMIT |
"Anda telah mencapai batas perusahaan untuk akun Anda." |
Batas maksimum perusahaan tercapai |
PROJECT_LIMIT |
"Anda telah mencapai batas proyek untuk perusahaan Anda." |
Batas maksimum proyek tercapai |
USER_LIMIT |
"Anda telah mencapai batas pengguna untuk perusahaan Anda." |
Batas maksimum pengguna tercapai |
PROJECT_TEMPLATE_LIMIT |
"Anda telah mencapai batas template untuk perusahaan Anda." |
Batas maksimum template tercapai |
CUSTOM_FIELD_LIMIT |
"Batas bidang kustom tercapai." |
Batas maksimum bidang kustom tercapai |
TODO_LIST_LIMIT |
"Anda telah mencapai batas daftar untuk proyek Anda." |
Batas maksimum daftar per proyek |
TOO_MANY_TODOS |
"Terlalu banyak todo." |
Batas rekaman terlampaui |
TOO_MANY_OPTIONS |
"Terlalu banyak opsi." |
Batas opsi bidang pilih terlampaui |
MAX_FILE_SIZE |
"Ukuran file maksimum adalah 4.8gb" |
Batas ukuran unggahan file terlampaui |
Konflik Sumber Daya
| Kode Kesalahan |
Pesan |
Deskripsi |
TAG_ALREADY_EXISTS |
"Tag sudah ada." |
Tag dengan nama yang sama ada dalam proyek |
COMPANY_SLUG_ALREADY_EXISTS |
"Perusahaan sudah ada." |
Slug/URL perusahaan sudah digunakan |
USER_ALREADY_EXISTS |
"Pengguna sudah ada." |
Email pengguna sudah terdaftar |
ALREADY_INVITED |
"Pengguna sudah diundang." |
Pengguna sudah memiliki undangan yang tertunda |
USER_ALREADY_IN_PROJECT |
"Pengguna sudah ada di proyek ini." |
Pengguna sudah memiliki akses proyek |
FILE_TYPE_NOT_ALLOWED |
"Tipe file tidak diizinkan." |
Tipe file yang diunggah dibatasi |
Kesalahan Izin & Akses
| Kode Kesalahan |
Pesan |
Deskripsi |
UNABLE_TO_DELETE_ONLY_ADMIN |
"Tidak dapat menghapus satu-satunya Admin di perusahaan." |
Tidak dapat menghapus admin terakhir |
UNABLE_TO_UPDATE_OWNER |
"Tidak dapat memperbarui PEMILIK." |
Tidak dapat mengubah izin pemilik |
TODO_LIST_IS_HIDDEN |
"Daftar todo tersembunyi." |
Daftar tersembunyi dari peran pengguna |
COMPANY_NOT_ACTIVE |
"Perusahaan tidak aktif." |
Langganan perusahaan tidak aktif |
PROJECT_NOT_ACTIVE |
"Proyek tidak aktif." |
Proyek diarsipkan/tidak aktif |
Kesalahan Integritas Data
| Kode Kesalahan |
Pesan |
Deskripsi |
UNABLE_TO_DELETE_LIST_WITH_TODOS |
"Tidak dapat menghapus daftar dengan todo." |
Daftar harus kosong untuk dihapus |
UNABLE_TO_DELTE_FILE |
"Tidak dapat menghapus file." |
Penghapusan file gagal (kesalahan ketik dalam kode) |
UNABLE_TO_MOVE_TODO |
"Tidak dapat memindahkan todo." |
Tidak dapat memindahkan rekaman antar daftar |
DEPENDENCY_HAS_DEPENDENCY |
"Ketergantungan memiliki ketergantungan" |
Ketergantungan melingkar terdeteksi |
TODO_DEPENDS_ON_ITSELF |
"Todo bergantung pada dirinya sendiri" |
Ketergantungan referensi diri |
Kesalahan Stripe/Pembayaran
| Kode Kesalahan |
Pesan |
Deskripsi |
STRIPE_CREATING_CUSTOMER |
"Kesalahan saat membuat pelanggan di stripe." |
Pembuatan pelanggan Stripe gagal |
STRIPE_ALREADY_SUBSCRIBED |
"Sudah berlangganan." |
Langganan aktif ada |
STRIPE_MISSING_PAYMENT_METHOD |
"Metode pembayaran hilang." |
Tidak ada metode pembayaran yang terdaftar |
STRIPE_CREATING_SUBSCRIPTION |
"Kesalahan saat membuat langganan di stripe." |
Pembuatan langganan gagal |
STRIPE_UPDATING_SUBSCRIPTION |
"Kesalahan saat memperbarui langganan di stripe." |
Pembaruan langganan gagal |
STRIPE_CHECKOUT_SESSION |
"Kesalahan saat membuat sesi checkout di stripe." |
Pembuatan sesi checkout gagal |
STRIPE_CUSTOMER_PORTAL |
"Kesalahan saat membuat portal pelanggan di stripe." |
Pembuatan sesi portal gagal |
STRIPE_TAX_ID |
"Tidak dapat menyimpan ID pajak" |
Validasi/simpan ID pajak gagal |
PAYMENT_REQUIRED |
"Pembayaran diperlukan." |
Fitur memerlukan langganan aktif |
NO_PAYMENT_REQUIRED |
"Tidak ada pembayaran yang diperlukan." |
Pembayaran tidak diperlukan untuk operasi |
Kesalahan Autentikasi & Sesi
| Kode Kesalahan |
Pesan |
Deskripsi |
INVALID_CREDENTIALS |
"Kredensial tidak valid." |
Nama pengguna/kata sandi salah |
EXPIRED_RESET_TOKEN |
"Token reset telah kedaluwarsa." |
Token reset kata sandi kedaluwarsa |
OAUTH_FAILED |
"Proses OAuth gagal." |
Autentikasi OAuth gagal |
SAML_NOT_ENABLED |
"SSO (SAML) tidak diaktifkan." |
SSO SAML tidak dikonfigurasi |
SSO_AUTO_PROVISION_DISABLED |
"Auto provision dinonaktifkan." |
Tidak dapat membuat pengguna SSO secara otomatis |
Pembatasan Laju
Pembatasan laju ditangani oleh paket graphql-rate-limit dengan konfigurasi yang berbeda:
| Jenis Batas |
Jendela |
Permintaan Maks |
Diterapkan Pada |
| Standard |
60s |
500 |
Most queries/mutations |
| Sensitive |
300s |
10 |
Password reset, auth operations |
| Expensive |
60s |
20 |
Complex queries, bulk operations |
| Search |
60s |
60 |
Search operations |
| File Upload |
60s |
100 |
File upload operations |
Ketika dibatasi, Anda akan menerima kesalahan GraphQL standar dengan pesan yang menunjukkan batas terlampaui.
Kesalahan Sistem & Internal
| Kode Kesalahan |
Pesan |
Deskripsi |
INTERNAL_SERVER_ERROR |
"Kesalahan server internal." |
Kesalahan generik untuk kesalahan tidak aman dalam produksi |
UNKNOWN_ERROR |
"Kesalahan tidak dikenal." |
Kesalahan tak terduga terjadi |
RESOLVER_NOT_FOUND |
"Resolver tidak ditemukan" |
Resolver GraphQL hilang |
FIELD_NOT_IN_SCHEMA |
"Field tidak ada dalam skema" |
Field yang diminta tidak ada |
Praktik Terbaik Penanganan Kesalahan
Penanganan Sisi Klien
try {
const result = await client.mutate({
mutation: CREATE_TODO,
variables: { input }
});
} catch (error) {
if (error.graphQLErrors?.length > 0) {
const errorCode = error.graphQLErrors[0].extensions?.code;
switch (errorCode) {
case 'UNAUTHENTICATED':
// Redirect to login
break;
case 'TODO_NOT_FOUND':
// Show "Record not found" message
break;
case 'VALIDATION_ERROR':
// Display validation errors
break;
default:
// Show generic error message
}
}
}
Skenario Kesalahan Umum
- Autentikasi Diperlukan:
UNAUTHENTICATED - Pengguna perlu masuk
- Izin Ditolak:
FORBIDDEN - Pengguna tidak memiliki peran/izin yang diperlukan
- Sumber Daya Tidak Ditemukan:
*_NOT_FOUND - Sumber daya tidak ada atau pengguna tidak dapat mengaksesnya
- Validasi Gagal:
VALIDATION_ERROR, BAD_USER_INPUT - Periksa parameter input
- Pembatasan Laju: Periksa header batas laju dan terapkan penundaan
- Pembayaran Diperlukan:
PAYMENT_REQUIRED - Fitur memerlukan langganan
Dokumentasi Terkait